C C 預定義巨集

2021-05-26 02:38:16 字數 2384 閱讀 7391

下面描述的巨集定義,不需引用其他標頭檔案,直接可用於**中。特定的作用給我們提供了不少的便利。分別描述如下:

1 -- __file__,__line__,__function__或者__func__

__file__:當前程式行所在原始檔名稱,標準c支援,該巨集當做字串對待;

__line__:當前程式行所在原始檔內的行號,標準c支援,該巨集當做整形對待;

__function__或者__func__:當前程式行所屬的函式名稱,c99支援(如:vc++6.0不支援),該巨集當做字串對待;

結合列印日誌功能,這些資訊將有助於除錯。簡單的使用方法:

//將該程式儲存為test.cpp

#include using namespace std;

int main(int argc, char *argv)

執行上述程式將列印:file:test.cpp|line:8|function:main|main

特別說明,據參考資料中關於__func__的資訊稱,__func__不是乙個巨集,它是編譯隱式宣告的常量字元陣列:static const char __func__ = "function-name"。

2 -- __date__,__time__

__date__:當前檔案的編譯日期,格式是mmm:dd:yyyy。該巨集當做字串對待。

__time__:當前檔案的編譯時間,格式是hh:mm:ss。該巨集當做字串對待。

編譯原始檔時,假如該巨集,可以讓程式列印出編譯時間,達到區分不同版本的目的。簡單使用方法如下:

#include using namespace std;

int main(int argc, char *argv)

執行上述程式將列印:date:oct 20 2010|time:23:33:24。不重新編譯程式的情況下,每次執行該程式列印的都將是是這個時間,而不是系統的當前時間。這個時間要區別理解下。

3 -- #line

#line用於重置由__line__和__file__巨集指定的行號和檔名。比如說我們有這麼乙個測試程式:

//將該程式儲存為test.cpp

#include using namespace std;

int main(int argc, char *argv)

注釋掉第8行**,程式列印:file:test.cpp|line:9

不注釋第8行**,程式列印:file:baidu.cpp|line:100

可見:#line指定下行**的起始行號和原始檔名稱,作用域到檔案末尾或者再次#line的使用處。

4 -- __gunc__

__gunc__,是gcc編譯器的預定義,表明當前gnuc編譯的版本。__gnuc__ 的值表示gcc的版本,需要針對gcc特定版本編寫**時,可以使用該巨集進行條件編譯。

6 -- 巨集定義的"#"和"##"使用方法

"#":替換巨集引數時,將其後面的巨集引數轉換成帶引號的字串,例如:

#define str(s) #s

int main()

c編譯器在預處理**時,第5行實際翻譯成:std::string str = "abcdefg";

"##":將該符號前後的兩個巨集引數連線在一起,比如:

#define print(print_funname, var) print_##print_funname(var)

int main()

c編譯器在預處理**時,第5行實際翻譯成:print_common(5);

我們實際看下綜合運用的例子:

//#include #define print(fun, name, var) print_##fun(#name, var)

void print_common(const std::string & name, int var)

void print_tofile(const std::string & name, int var)

int main()

這個**的意思是,在主函式中以統一的呼叫入口"print"該巨集函式,通過制定不同的函式名稱,將變數的名稱和值列印到不同的地方,比如螢幕或者檔案中。

我們使用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 提前編譯出來了,那個時候程式裡的結構是個啥樣子編譯器壓根就...