在 C/C++ 編程語(yǔ)言中,當(dāng)程序被編譯時(shí),被發(fā)送到編譯器,編譯器將程序轉(zhuǎn)換為機(jī)器語(yǔ)言,然后完成編譯并執(zhí)行該程序。預(yù)處理器也稱(chēng)為宏預(yù)處理器。C /C++中的宏可以定義為一組程序語(yǔ)句,并在必須使用這些代碼集時(shí)使用該名稱(chēng)。
這些宏始終以符號(hào)“#”開(kāi)頭,以該符號(hào)開(kāi)頭的語(yǔ)句由編譯器調(diào)用。
#define 奇妙用法
- 特殊符號(hào):#,##,#@
該宏還可用于傳遞可以通過(guò)在標(biāo)記前使用“#”特殊符號(hào)將其轉(zhuǎn)換為字符串的標(biāo)記。讓我們看一個(gè)例子:
int main(int argc, char *argv[]){printf("%s ", GET_STRING(minger));return 0;}

在上面的代碼中,我們定義了類(lèi)似函數(shù)的宏,其中參數(shù)“n”與“#n”一起傳遞,這將允許您檢索字符串文字。
該宏還支持將可以傳遞給宏以使用特殊運(yùn)算符“##”連接字符串。讓我們看一個(gè)例子:
int main(int argc, char *argv[]){printf("%d ", CONCATE(12, 13));return 0;}

上面的代碼定義了類(lèi)似函數(shù)的宏,其中傳遞令牌以連接“p”和“q”兩個(gè)值。
下面我們接著看看#@使用。
int main(int argc, char *argv[]){printf("%s ", TO_STRING(812));return 0;}

在上面的代碼中,我們定義了類(lèi)似函數(shù)的宏,#s 表示用雙引號(hào)包括參數(shù)s,返回一個(gè)字符串。
- 多行宏
類(lèi)似對(duì)象的宏可以有多行。因此,要?jiǎng)?chuàng)建多行宏,您必須使用反斜杠換行符。
2,3int 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;}

宏也可以寫(xiě)成多行,語(yǔ)句以“”開(kāi)頭,不需要以“”結(jié)尾。讓我們?cè)倏匆粋€(gè)例子:
{printf();n++;}int main(int argc, char *argv[]){int n = 0;MACRO(n, 5);printf(" ");return 0;}

- 可變參數(shù)宏
可變參數(shù)宏是具有可變數(shù)量參數(shù)的宏(也可以用 C 編寫(xiě)可變參數(shù)函數(shù))。下面是一個(gè)例子:
int main(int argc, char** argv){debugPrintf("Hello World! ");return 0;}

簡(jiǎn)單來(lái)說(shuō),...表示所有剩下的參數(shù),__VA_ARGS__被宏定義中的...參數(shù)所替換。這在c語(yǔ)言的GNU擴(kuò)展語(yǔ)法里是一個(gè)特殊規(guī)則:當(dāng)__VA_ARGS__為空時(shí),會(huì)消除前面這個(gè)逗號(hào)。
- 條件編譯
int main(int argc, char** argv){debugPrintf(" This is Debug info ");printf(" This is printf info ");return 0;}

如果我們要輸出DEBUG版本,則打開(kāi)這個(gè)宏開(kāi)關(guān)(不屏蔽#define debugPrintf ),此時(shí)所有的debugPrintf ()宏定義信息都會(huì)被替換成為printf()。
總結(jié)
宏是程序中由宏的值替換的一段代碼。宏由#define 指令定義。每當(dāng)編譯器遇到宏名稱(chēng)時(shí),它就會(huì)用宏的定義替換名稱(chēng)。宏定義不需要以分號(hào);結(jié)束。
原文標(biāo)題:#define的妙用
文章出處:【微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
審核編輯:湯梓紅
-
語(yǔ)言
+關(guān)注
關(guān)注
1文章
97瀏覽量
24686 -
代碼
+關(guān)注
關(guān)注
30文章
4924瀏覽量
72381 -
編譯器
+關(guān)注
關(guān)注
1文章
1665瀏覽量
50908
原文標(biāo)題:#define的妙用
文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
C語(yǔ)言typedef與#define的用法和區(qū)別
C語(yǔ)言#define和typedef的區(qū)別
#ifdef,#else,#endif,#if用法詳解(轉(zhuǎn)載)
typedef與define的用法與區(qū)別
OrCAD中創(chuàng)建總線及用法詳解
C語(yǔ)言中#define的一些用法介紹概述
你會(huì)使用Linux 中的“!”驚嘆用法嗎
C語(yǔ)言中的typedef的用法

詳解#define的奇妙用法
評(píng)論