在 C/C++ 編程語言中,當(dāng)程序被編譯時,被發(fā)送到編譯器,編譯器將程序轉(zhuǎn)換為機器語言,然后完成編譯并執(zhí)行該程序。預(yù)處理器也稱為宏預(yù)處理器。C /C++中的宏可以定義為一組程序語句,并在必須使用這些代碼集時使用該名稱。
這些宏始終以符號“#”開頭,以該符號開頭的語句由編譯器調(diào)用。
#define 奇妙用法
特殊符號:#,##,#@
該宏還可用于傳遞可以通過在標(biāo)記前使用“#”特殊符號將其轉(zhuǎn)換為字符串的標(biāo)記。讓我們看一個例子:
?
?
#include#define GET_STRING(n) #n int main(int argc, char *argv[]) { printf("%s ", GET_STRING(minger)); return 0; }
?
?
在上面的代碼中,我們定義了類似函數(shù)的宏,其中參數(shù)“n”與“#n”一起傳遞,這將允許您檢索字符串文字。
該宏還支持將可以傳遞給宏以使用特殊運算符“##”連接字符串。讓我們看一個例子:
?
?
#include#define CONCATE(p, q) p##q int main(int argc, char *argv[]) { printf("%d ", CONCATE(12, 13)); return 0; }
?
?
上面的代碼定義了類似函數(shù)的宏,其中傳遞令牌以連接“p”和“q”兩個值。
下面我們接著看看#@使用。
?
?
#include#define TO_STRING(s) #s int main(int argc, char *argv[]) { printf("%s ", TO_STRING(812)); return 0; }
?
?
在上面的代碼中,我們定義了類似函數(shù)的宏,#s 表示用雙引號包括參數(shù)s,返回一個字符串。
多行宏
類似對象的宏可以有多行。因此,要創(chuàng)建多行宏,您必須使用反斜杠換行符。
?
?
#include#define ELE 1, 2, 3 int main(int argc, char *argv[]) { int i = 0; int arr[] = { ELE }; printf("Elements of Array are: "); for (i = 0; i < 3; i++) { printf("%d ", arr[i]); } printf(" "); return 0; }
?
?
宏也可以寫成多行,語句以“”開頭,不需要以“”結(jié)尾。讓我們再看一個例子:
?
?
#include#define MACRO(n, limit) while (n < limit) { printf("minger "); n++; } int main(int argc, char *argv[]) { int n = 0; MACRO(n, 5); printf(" "); return 0; }
?
?
可變參數(shù)宏
可變參數(shù)宏是具有可變數(shù)量參數(shù)的宏(也可以用 C 編寫可變參數(shù)函數(shù))。下面是一個例子:
?
?
#include#define debugPrintf(...) printf("DEBUG: " __VA_ARGS__); int main(int argc, char** argv) { debugPrintf("Hello World! "); return 0; }
?
?
簡單來說,...表示所有剩下的參數(shù),__VA_ARGS__被宏定義中的...參數(shù)所替換。這在c語言的GNU擴展語法里是一個特殊規(guī)則:當(dāng)__VA_ARGS__為空時,會消除前面這個逗號。
條件編譯
?
?
#include#define debugPrintf /*定義一個宏開關(guān),屏蔽則關(guān)閉,不屏蔽則打開 */ #ifdef debugPrintf #define debugPrintf(...) printf("DEBUG: " __VA_ARGS__); #else #define debugPrintf(...) #endif int main(int argc, char** argv) { debugPrintf(" This is Debug info "); printf(" This is printf info "); return 0; }
?
?
如果我們要輸出DEBUG版本,則打開這個宏開關(guān)(不屏蔽#define debugPrintf ),此時所有的debugPrintf ()宏定義信息都會被替換成為printf()。
總結(jié)
宏是程序中由宏的值替換的一段代碼。宏由#define 指令定義。每當(dāng)編譯器遇到宏名稱時,它就會用宏的定義替換名稱。宏定義不需要以分號;結(jié)束。
審核編輯:黃飛
?
評論
查看更多