在 C/C++ 編程語言中,當(dāng)程序被編譯時(shí),被發(fā)送到編譯器,編譯器將程序轉(zhuǎn)換為機(jī)器語言,然后完成編譯并執(zhí)行該程序。預(yù)處理器也稱為宏預(yù)處理器。C /C++中的宏可以定義為一組程序語句,并在必須使用這些代碼集時(shí)使用該名稱。
這些宏始終以符號“#”開頭,以該符號開頭的語句由編譯器調(diào)用。
#define 奇妙用法
- 特殊符號:#,##,#@
該宏還可用于傳遞可以通過在標(biāo)記前使用“#”特殊符號將其轉(zhuǎn)換為字符串的標(biāo)記。讓我們看一個(gè)例子:
int main(int argc, char *argv[])
{
printf("%s ", GET_STRING(minger));
return 0;
}
在上面的代碼中,我們定義了類似函數(shù)的宏,其中參數(shù)“n”與“#n”一起傳遞,這將允許您檢索字符串文字。
該宏還支持將可以傳遞給宏以使用特殊運(yùn)算符“##”連接字符串。讓我們看一個(gè)例子:
int main(int argc, char *argv[])
{
printf("%d ", CONCATE(12, 13));
return 0;
}
上面的代碼定義了類似函數(shù)的宏,其中傳遞令牌以連接“p”和“q”兩個(gè)值。
下面我們接著看看#@使用。
int main(int argc, char *argv[])
{
printf("%s ", TO_STRING(812));
return 0;
}
在上面的代碼中,我們定義了類似函數(shù)的宏,#s 表示用雙引號包括參數(shù)s,返回一個(gè)字符串。
- 多行宏
類似對象的宏可以有多行。因此,要?jiǎng)?chuàng)建多行宏,您必須使用反斜杠換行符。
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é)尾。讓我們再看一個(gè)例子:
{
printf( );
n++;
}
int main(int argc, char *argv[])
{
int n = 0;
MACRO(n, 5);
printf(" ");
return 0;
}
- 可變參數(shù)宏
可變參數(shù)宏是具有可變數(shù)量參數(shù)的宏(也可以用 C 編寫可變參數(shù)函數(shù))。下面是一個(gè)例子:
int main(int argc, char** argv)
{
debugPrintf("Hello World! ");
return 0;
}
簡單來說,...表示所有剩下的參數(shù),__VA_ARGS__被宏定義中的...參數(shù)所替換。這在c語言的GNU擴(kuò)展語法里是一個(gè)特殊規(guī)則:當(dāng)__VA_ARGS__為空時(shí),會(huì)消除前面這個(gè)逗號。
- 條件編譯
int main(int argc, char** argv)
{
debugPrintf(" This is Debug info ");
printf(" This is printf info ");
return 0;
}
如果我們要輸出DEBUG版本,則打開這個(gè)宏開關(guān)(不屏蔽#define debugPrintf ),此時(shí)所有的debugPrintf ()宏定義信息都會(huì)被替換成為printf()。
總結(jié)
宏是程序中由宏的值替換的一段代碼。宏由#define 指令定義。每當(dāng)編譯器遇到宏名稱時(shí),它就會(huì)用宏的定義替換名稱。宏定義不需要以分號;結(jié)束。
-
語言
+關(guān)注
關(guān)注
1文章
97瀏覽量
24294 -
代碼
+關(guān)注
關(guān)注
30文章
4841瀏覽量
69143 -
編譯器
+關(guān)注
關(guān)注
1文章
1642瀏覽量
49318
原文標(biāo)題:#define的妙用
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
C語言typedef與#define的用法和區(qū)別
C語言#define和typedef的區(qū)別
#ifdef,#else,#endif,#if用法詳解(轉(zhuǎn)載)
typedef與define的用法與區(qū)別
OrCAD中創(chuàng)建總線及用法詳解
C語言中#define的一些用法介紹概述
你會(huì)使用Linux 中的“!”驚嘆用法嗎
C語言中的typedef的用法
![C語言中的typedef的<b class='flag-5'>用法</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論