?宏
- _LINE_ 表示正在編譯的文件的行號
- _FILE_ 表示正在編譯的文件的名字
- _DATE_ 表示編譯時刻的日期字符串,例如: "25 Dec 2007"
- _TIME_ 表示編譯時刻的時間字符串,例如: "12:30:55"
- _STDC_ 判斷該文件是不是定義成標準 C 程序
- 宏名的書寫由標識符與兩邊各二條下劃線構成
- #define PI 3.141592654
- const 修飾的不是常量而是 readonly 的變量,const 修飾的只讀變量不能用來作為定義數組的維數, 也不能放在 case 關鍵字后面。
- #define ENG_PATH_4 E:\\English\\listen_to_this\\listen_to_this_3? 路徑使用雙 反斜杠? ?單\ 表示連接符
?
- 宏的生命周期從#define 開始到#undef 結束?
條件編譯
- 條件編譯的功能使得我們可以按不同的條件去編譯不同的程序部分,因而產生不同的目標代碼文件。這對于程序的移植和調試是很有用的。
- 條件編譯有三種形式
?
?文件包含
- 文件包含是將多個源文件鏈接形成一個源文件進行編譯,形成一個目標文件
- #include<>?預處理到 系統規定的路徑中去獲得這個文件(即 C 編譯系統所提供的并存放在指定的子目錄下的頭 文件)。找到文件后,用文件內容替換該語句
- filename 為要包含的文件名稱。雙引號表示預處理應在當前目錄中查找文件名為 filename 的文件,若沒有找到,則按系統指定的路徑信息,搜索其他目錄。找到文件后,用 文件內容替換該語句。
- 需要強調的一點是:#include 是將已存在文件的內容嵌入到當前文件中。 另外關于#include 的路徑也有點要說明:include 支持相對路徑,格式如 trackant(蟻跡尋
蹤)所寫: .代表當前目錄,..代表上層目錄。
#error預處理
- #error 預處理指令的作用是,編譯程序時,只要遇到 #error 就會生成一個編譯錯誤提 示消息,并停止編譯。
- 其語法格式為:??#error error-message
- 注意,宏串 error-message 不用雙引號包圍。遇到#error 指令時,錯誤信息被顯示,可能同時 還顯示編譯程序作者預先定義的其他內容。關于系統所支持的 error-message 信息,請查找 相關資料
#line處理
- #line 的作用是改變當前行數和文件名稱,它們是在編譯程序中預先定義的標識符 命令的基本形式如下:
- #line number["filename"]? ?其中[]內的文件名可以省略?#line 30 a.h? 其中,文件名 a.h 可以省略不寫。
- 這條指令可以改變當前的行號和文件名,例如上面的這條預處理指令就可以改變當前的行號 為 30,文件名是 a.h。初看起來似乎沒有什么用,不過,他還是有點用的,那就是用在編譯 器的編寫中,我們知道編譯器對 C 源碼編譯過程中會產生一些中間文件,通過這條指令, 可以保證文件名是固定的,不會被這些中間文件代替,有利于進行分析。
#pragma
- #pragma 指令可能是最復雜的了,它的作用是設定編譯器的 狀態或者是指示編譯器完成一些特定的動作。#pragma 指令對每個編譯器給出了一個方法, 在保持與 C 和 C ++語言完全兼容的情況下,給出主機或操作系統專有的特征。依據定義,編譯 指示是機器或操作系統專有的,且對于每個編譯器都是不同的。
- 其格式一般為: #pragma para? ? ?其中 para 為參數,下面來看一些常用的參數。?
#pragma message
- message 參數:Message 參數是我最喜歡的一個參數,它能夠在編譯信息輸出窗口中輸出相應的信息,這對于源代碼信息的控制是非常重要的。
- 其使用方法為:? #pragma message(“消息文本”)
- 當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來。 當我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有 正確的設置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判 斷自己有沒有在源代碼的什么地方定義了_X86 這個宏可以用下面的方法?
?
?
?
內存對齊
- ?利用#pragma pack()來改變編譯器的默認對齊方式
- 使用指令#pragma pack (n),編譯器將按照 n 個字節對齊。
- 使用指令#pragma pack (),編譯器將取消自定義字節對齊方式。 在#pragma pack (n)和#pragma pack ()之間的代碼按 n 個字節對齊。
- 但是,成員對齊有一個重要的條件,即每個成員按自己的方式對齊.也就是說雖然指定了 按 n 字節對齊,但并不是所有的成員都是以 n 字節對齊。其對齊的規則是,每個成員按其類型 的對齊參數(通常是這個類型的大小)和指定對齊參數(這里是 n 字節)中較小的一個對齊,即: min( n, sizeof( item )) 。并且結構的長度必須為所用過的所有對齊參數的整數倍,不夠就補空 字節。
- 注意事項?
#?
- ?在字符串中包含宏參數,那我們就可以使用“#”,它可以把語言符號轉 化為字符串
##運算符
- 和#運算符一樣,##運算符可以用于宏函數的替換部分。這個運算符把兩個語言符號組合成單個語言符號?