詳解C語(yǔ)言中的#define宏定義命令用法
#define
命令#define定義了一個(gè)標(biāo)識(shí)符及一個(gè)串。在源程序中每次遇到該標(biāo)識(shí)符時(shí),均以定義的串代換它。ANSI標(biāo)準(zhǔn)將標(biāo)識(shí)符定義為宏名,將替換過(guò)程稱為宏替換。命令的一般形式為:
#define identifier string
注意:
1.該語(yǔ)句沒(méi)有分號(hào)。在標(biāo)識(shí)符和串之間可以有任意個(gè)空格,串一旦開(kāi)始,僅由一新行結(jié)束。
2.宏名定義后,即可成為其它宏名定義中的一部分。
3.宏替換僅僅是以文本串代替宏標(biāo)識(shí)符,前提是宏標(biāo)識(shí)符必須獨(dú)立的識(shí)別出來(lái),否則不進(jìn)行替換。例如:
#define XYZ this is a tes
使用宏printf("XYZ");//該段不打印"this is a test"而打印"XYZ"。因?yàn)轭A(yù)編譯器識(shí)別出的是"XYZ"
4.如果串長(zhǎng)于一行,可以在該行末尾用一反斜杠' \'續(xù)行。
#defineLONG_STRING"this is a very long\
string that is used as an example"
5.C語(yǔ)言程序普遍使用大寫(xiě)字母定義標(biāo)識(shí)符。
6.用宏代換代替實(shí)在的函數(shù)的一大好處是宏替換增加了代碼的速度,因?yàn)椴淮嬖诤瘮?shù)調(diào)用的開(kāi)銷。但增加速度也有代價(jià):由于重復(fù)編碼而增加了程序長(zhǎng)度。
宏定義的注意事項(xiàng)
試圖使用宏去定義注釋符號(hào)是不行的,例如以下代碼:
#define BSC // #define BMC /* #define EMC */ BSC my single-line comment BMC my multi-line comment EMC
因?yàn)樽⑨屜扔陬A(yù)處理指令處理,當(dāng)展開(kāi)這些宏定義的時(shí)候自然會(huì)出現(xiàn)一堆錯(cuò)誤。
宏定義表達(dá)式的時(shí)候一定不能吝嗇括號(hào)。這個(gè)不用解釋了。
宏定義的時(shí)候宏名中最好不要有空格。下面的定義會(huì)帶來(lái)很多麻煩:
#define SUM (x) ((x)*(x))
一旦使用了#undef撤銷宏,則后面的代碼都不能使用這個(gè)宏,除非再次定義。此外,如果沒(méi)有#undef的情形下就直接再次定義,后來(lái)的定義會(huì)覆蓋掉前面的定義。下面代碼中的c值是4:
#include <stdio.h> #define X 3 #define Y X*2 #undef X #define X 2 int c = Y; int main(int argc, char** argv){ printf("%d",c) ; return 0; }
宏僅在使用的時(shí)候展開(kāi),否則即使定義有問(wèn)題,也不會(huì)編譯出錯(cuò)。如果把上面代碼中的第二個(gè)#define注釋掉,并把C的值賦值為0,即撤銷了X定義,也不會(huì)報(bào)錯(cuò),因?yàn)闆](méi)有使用Y,也就不會(huì)展開(kāi)。
相關(guān)文章
C語(yǔ)言設(shè)計(jì)前中后隊(duì)列實(shí)例代碼
隊(duì)列最主要的作用就是用來(lái)管理數(shù)據(jù)流的,防止數(shù)據(jù)因?yàn)閭鬏旑l率過(guò)快得不到及時(shí)處理而丟失,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言設(shè)計(jì)前中后隊(duì)列的相關(guān)資料,需要的朋友可以參考下2021-12-12C語(yǔ)言sizeof和strlen區(qū)別小結(jié)
C語(yǔ)言中的sizeof和strlen是兩個(gè)常用的操作符/函數(shù),但它們的功能和用途有很大的區(qū)別,本文就詳細(xì)的來(lái)介紹一下C語(yǔ)言sizeof和strlen區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01Qt音視頻開(kāi)發(fā)之實(shí)現(xiàn)ffmpeg視頻旋轉(zhuǎn)顯示
這篇文章主要為大家詳細(xì)介紹了在Qt音視頻開(kāi)發(fā)中如何利用ffmpeg實(shí)現(xiàn)視頻旋轉(zhuǎn)顯示,文中的實(shí)現(xiàn)步驟講講清晰,感興趣的小伙伴可以了解一下2023-03-03利用反射獲得類的public static/const成員的值實(shí)例
下面小編就為大家?guī)?lái)一篇利用反射獲得類的public static/const成員的值實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12C語(yǔ)言全面梳理結(jié)構(gòu)體知識(shí)點(diǎn)
結(jié)構(gòu)體是一些值的集合,這些值稱為成員變量,結(jié)構(gòu)體的每個(gè)成員可以是不同類型的變量。本文將通過(guò)示例為大家詳細(xì)講講C語(yǔ)言中結(jié)構(gòu)體的使用,需要的可以參考一下2022-07-07C語(yǔ)言實(shí)現(xiàn)套接字操作的示例代碼
在C語(yǔ)言中,套接字(Socket)是一種進(jìn)行網(wǎng)絡(luò)通信的接口,這篇文章就來(lái)和大家介紹一下C語(yǔ)言中是如何進(jìn)行套接字操作的,需要的可以參考一下2023-06-06C++:構(gòu)造函數(shù),析構(gòu)函數(shù)詳解
今天小編就為大家分享一篇關(guān)于C++構(gòu)造函數(shù)和析構(gòu)函數(shù)的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2021-09-09