在 C/C++ 編程語言中,當程序被編譯時,被發送到編譯器,編譯器將程序轉換為機器語言,然后完成編譯并執行該程序。預處理器也稱為宏預處理器。C /C++中的宏可以定義為一組程序語句,并在必須使用這些代碼集時使用該名稱。
這些宏始終以符號“#”開頭,以該符號開頭的語句由編譯器調用。
#define 奇妙用法
- 特殊符號:#,##,#@
該宏還可用于傳遞可以通過在標記前使用“#”特殊符號將其轉換為字符串的標記。讓我們看一個例子:
int main(int argc, char *argv[])
{
printf("%s ", GET_STRING(minger));
return 0;
}
在上面的代碼中,我們定義了類似函數的宏,其中參數“n”與“#n”一起傳遞,這將允許您檢索字符串文字。
該宏還支持將可以傳遞給宏以使用特殊運算符“##”連接字符串。讓我們看一個例子:
int main(int argc, char *argv[])
{
printf("%d ", CONCATE(12, 13));
return 0;
}
上面的代碼定義了類似函數的宏,其中傳遞令牌以連接“p”和“q”兩個值。
下面我們接著看看#@使用。
int main(int argc, char *argv[])
{
printf("%s ", TO_STRING(812));
return 0;
}
在上面的代碼中,我們定義了類似函數的宏,#s 表示用雙引號包括參數s,返回一個字符串。
- 多行宏
類似對象的宏可以有多行。因此,要創建多行宏,您必須使用反斜杠換行符。
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;
}
宏也可以寫成多行,語句以“”開頭,不需要以“”結尾。讓我們再看一個例子:
{
printf( );
n++;
}
int main(int argc, char *argv[])
{
int n = 0;
MACRO(n, 5);
printf(" ");
return 0;
}
- 可變參數宏
可變參數宏是具有可變數量參數的宏(也可以用 C 編寫可變參數函數)。下面是一個例子:
int main(int argc, char** argv)
{
debugPrintf("Hello World! ");
return 0;
}
簡單來說,...表示所有剩下的參數,__VA_ARGS__被宏定義中的...參數所替換。這在c語言的GNU擴展語法里是一個特殊規則:當__VA_ARGS__為空時,會消除前面這個逗號。
- 條件編譯
int main(int argc, char** argv)
{
debugPrintf(" This is Debug info ");
printf(" This is printf info ");
return 0;
}
如果我們要輸出DEBUG版本,則打開這個宏開關(不屏蔽#define debugPrintf ),此時所有的debugPrintf ()宏定義信息都會被替換成為printf()。
總結
宏是程序中由宏的值替換的一段代碼。宏由#define 指令定義。每當編譯器遇到宏名稱時,它就會用宏的定義替換名稱。宏定義不需要以分號;結束。
-
語言
+關注
關注
1文章
97瀏覽量
24242 -
代碼
+關注
關注
30文章
4788瀏覽量
68612 -
編譯器
+關注
關注
1文章
1634瀏覽量
49132
原文標題:#define的妙用
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論