C語言中宏(Macro)的處理在編譯器的預處理階段,具體可參考:GCC編譯C語言程序的全過程
1、#的預處理作用
預處理過程實質上是處理“#”,包括:
- 將#include包含的頭文件直接拷貝到.c當中;
- 將#define定義的宏進行替換;
- 將#if #else #endif定義的無用代碼過濾掉;
- 將代碼中沒用的註釋部分刪除等。
從而生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。
上面中符號“#”表示這是一條預處理命令,凡是以“#”開頭的一般均為預處理命令,比如:
- #include:是包含頭文件命令,聲明在這個地方插入別的文件中的代碼;
- #define 標識符 被標識符代表的字符串:其中,“define”為宏定義命令,“標識符”為所定義的宏名;
- #if #else #endif:是條件編譯命令,加上符號“#”的作用是:#if是編譯器在編譯代碼時完成的,if是在程序在運行時完成的,兩者的執行時期不同。
C語言中宏(Macro)的處理在編譯器的預處理階段,具體可參考:GCC編譯C語言程序的全過程
1、#的預處理作用
預處理過程實質上是處理“#”,包括:
- 將#include包含的頭文件直接拷貝到.c當中;
- 將#define定義的宏進行替換;
- 將#if #else #endif定義的無用代碼過濾掉;
- 將代碼中沒用的註釋部分刪除等。
從而生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。
上面中符號“#”表示這是一條預處理命令,凡是以“#”開頭的一般均為預處理命令,比如:
- #include:是包含頭文件命令,聲明在這個地方插入別的文件中的代碼;
- #define 標識符 被標識符代表的字符串:其中,“define”為宏定義命令,“標識符”為所定義的宏名;
- #if #else #endif:是條件編譯命令,加上符號“#”的作用是:#if是編譯器在編譯代碼時完成的,if是在程序在運行時完成的,兩者的執行時期不同。
2、#的字符串化作用
符號 # 也稱為字符串化運算符(stringify operator 或 stringizing operator),它會把宏調用時的實參轉換為字符串。見下面的代碼示例。
3、##的連接符作用
符號 ## 則是連接符號,由兩個井號組成,其功能是在帶參數的宏定義中將兩個子串聯接起來,從而形成一個新的子串。
代碼示例如下:
C語言中宏(Macro)的處理在編譯器的預處理階段,具體可參考:GCC編譯C語言程序的全過程
1、#的預處理作用
預處理過程實質上是處理“#”,包括:
- 將#include包含的頭文件直接拷貝到.c當中;
- 將#define定義的宏進行替換;
- 將#if #else #endif定義的無用代碼過濾掉;
- 將代碼中沒用的註釋部分刪除等。
從而生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。
上面中符號“#”表示這是一條預處理命令,凡是以“#”開頭的一般均為預處理命令,比如:
- #include:是包含頭文件命令,聲明在這個地方插入別的文件中的代碼;
- #define 標識符 被標識符代表的字符串:其中,“define”為宏定義命令,“標識符”為所定義的宏名;
- #if #else #endif:是條件編譯命令,加上符號“#”的作用是:#if是編譯器在編譯代碼時完成的,if是在程序在運行時完成的,兩者的執行時期不同。
2、#的字符串化作用
符號 # 也稱為字符串化運算符(stringify operator 或 stringizing operator),它會把宏調用時的實參轉換為字符串。見下面的代碼示例。
3、##的連接符作用
符號 ## 則是連接符號,由兩個井號組成,其功能是在帶參數的宏定義中將兩個子串聯接起來,從而形成一個新的子串。
代碼示例如下:
在上面這個例子中,show(6) 中的 #n 被當成了一個字符串“#6”,與前面的“result_”和後面的“: %d\\n”連到一起,組成“result_6: %d\\n”;而 result_##n,則替換為 result_6。
因此,show(6)也就變成:
printf("result_6: %d\\n", result_6)
程序運行結果則如上圖所示:
result_6: 666