下面描述的巨集定義,不需引用其他標頭檔案,直接可用於**中。特定的作用給我們提供了不少的便利。分別描述如下:
1 -- __file__,__line__,__function__或者__func__
__file__:當前程式行所在原始檔名稱,標準c支援,該巨集當做字串對待;
__line__:當前程式行所在原始檔內的行號,標準c支援,該巨集當做整形對待;
__function__或者__func__:當前程式行所屬的函式名稱,c99支援(如:vc++6.0不支援),該巨集當做字串對待;
結合列印日誌功能,這些資訊將有助於除錯。簡單的使用方法:
//將該程式儲存為test.cpp執行上述程式將列印:file:test.cpp|line:8|function:main|main#include using namespace std;
int main(int argc, char *argv)
特別說明,據參考資料中關於__func__的資訊稱,__func__不是乙個巨集,它是編譯隱式宣告的常量字元陣列:static const char __func__ = "function-name"。
2 -- __date__,__time__
__date__:當前檔案的編譯日期,格式是mmm:dd:yyyy。該巨集當做字串對待。
__time__:當前檔案的編譯時間,格式是hh:mm:ss。該巨集當做字串對待。
編譯原始檔時,假如該巨集,可以讓程式列印出編譯時間,達到區分不同版本的目的。簡單使用方法如下:
#include using namespace std;執行上述程式將列印:date:oct 20 2010|time:23:33:24。不重新編譯程式的情況下,每次執行該程式列印的都將是是這個時間,而不是系統的當前時間。這個時間要區別理解下。int main(int argc, char *argv)
3 -- #line
#line用於重置由__line__和__file__巨集指定的行號和檔名。比如說我們有這麼乙個測試程式:
//將該程式儲存為test.cpp注釋掉第8行**,程式列印:file:test.cpp|line:9#include using namespace std;
int main(int argc, char *argv)
不注釋第8行**,程式列印:file:baidu.cpp|line:100
可見:#line指定下行**的起始行號和原始檔名稱,作用域到檔案末尾或者再次#line的使用處。
4 -- __gunc__
__gunc__,是gcc編譯器的預定義,表明當前gnuc編譯的版本。__gnuc__ 的值表示gcc的版本,需要針對gcc特定版本編寫**時,可以使用該巨集進行條件編譯。
6 -- 巨集定義的"#"和"##"使用方法
"#":替換巨集引數時,將其後面的巨集引數轉換成帶引號的字串,例如:
#define str(s) #sc編譯器在預處理**時,第5行實際翻譯成:std::string str = "abcdefg";int main()
"##":將該符號前後的兩個巨集引數連線在一起,比如:
#define print(print_funname, var) print_##print_funname(var)c編譯器在預處理**時,第5行實際翻譯成:print_common(5);int main()
我們實際看下綜合運用的例子:
//#include #define print(fun, name, var) print_##fun(#name, var)這個**的意思是,在主函式中以統一的呼叫入口"print"該巨集函式,通過制定不同的函式名稱,將變數的名稱和值列印到不同的地方,比如螢幕或者檔案中。void print_common(const std::string & name, int var)
void print_tofile(const std::string & name, int var)
int main()
我們使用g++ -e marco.cpp預處理命令檢視下預處理後的原始檔:
# 1 "marco.cpp"# 1 ""
# 1 ""
# 1 "marco.cpp"
void print_common(const std::string & name, int var)
void print_tofile(const std::string & name, int var)
int main()
1/2/
C C 幾個預定義的巨集
一邊情況下,c c 編譯器會內建幾個巨集,這些巨集定義不僅可以幫助我們完成跨平台的原始碼編寫,靈活使用也可以巧妙地幫我們輸出非常有用的除錯資訊。ansi c標準中有幾個標準預定義巨集 也是常用的 編譯器在進行原始碼編譯的時候,會自動將這些巨集替換為相應內容。下面的 不僅展示了各個預定義巨集的使用,還...
C C 中的預定義巨集
標準預定義巨集 內容 file 代表當前源 檔名的字串文字 包含了詳細路徑,如 g program study c main.cpp line 代表當前源 中的行號的整數常量 date 進行預處理的日期 mmm dd yyyy 形式的字串文字,如 aug 27 2017 time 原始檔編譯時間 格...
預定義,巨集定義
巨集定義 其作用就是 換其名曰 給程式中的一段特殊的 函式,資料取了個簡單明瞭的名字。不過有一點這傢伙的作用範圍是全域性的。即使它是在某乙個函式塊中定義的。這個其實也容易理解。因為巨集定義是預定義的一種,在我們的程式之前,由預編譯器 cpp 提前編譯出來了,那個時候程式裡的結構是個啥樣子編譯器壓根就...