C語(yǔ)言#define定義宏的使用詳解
1.宏是什么
#define 機(jī)制包括了一個(gè)規(guī)定,允許把參數(shù)替換到文本中,這種實(shí)現(xiàn)通常稱為宏(macro)或定義宏(define macro)。
語(yǔ)法:
#define name( parament-list ) stuff
parament-list:是一個(gè)由逗號(hào)隔開(kāi)的符號(hào)表。
2.宏的用法
#define SUM(x,y) ((x)+(y))
int main()
{
int a = 10;
int b = 20;
int ret = SUM(a, b);
printf("%d\n", ret);
return 0;
}
簡(jiǎn)要說(shuō)明:宏已經(jīng)被替換
分位三個(gè)階段:預(yù)編譯、編譯、匯編
3. 宏的注意事項(xiàng)
定義什么替換什么
來(lái)看這一例:
#define NUM(x,y) x+y
int main()
{
int a = 2;
int b = 3;
printf("%d\n", NUM(a, b) * NUM(a, b));
//結(jié)果:11
return 0;
}
原因:num(a,b)*num(a,b) = a + b * a + b=11
4. 宏和函數(shù)的區(qū)別
| 屬性 | #define定義宏 | 函數(shù) |
|---|---|---|
| 代碼長(zhǎng)度 | 如果多次調(diào)用,多次替換,如果是大長(zhǎng)度宏其長(zhǎng)度很長(zhǎng) | 函數(shù)只實(shí)現(xiàn)一次可以多次使用,如果多次調(diào)用,長(zhǎng)度只有一份 |
| 執(zhí)行速度 | 更快 | 函數(shù)調(diào)用和開(kāi)辟都會(huì)有額外開(kāi)銷 |
| 操作符優(yōu)先級(jí) | 必須每個(gè)參數(shù)加上括號(hào),否則操作符優(yōu)先級(jí)可能會(huì)產(chǎn)生不可預(yù)料的后果 | 函數(shù)參數(shù)只在函數(shù)調(diào)用的時(shí)候求值一次,它的結(jié)果值傳遞給函數(shù)。表達(dá)式的求值結(jié)果更容易預(yù)測(cè) |
| 帶有副作用參數(shù) | 多次調(diào)用宏會(huì)有不可預(yù)料的后果 | 函數(shù)參數(shù)只在傳參的時(shí)候求值一次,結(jié)果更容易控制,只需關(guān)注是傳值還是傳址 |
| 參數(shù)類型 | 宏的參數(shù)和類型無(wú)關(guān),可以使用與任何參數(shù)類型 | 函數(shù)參數(shù)與類型有關(guān),類型取決于使用目的,傳值,傳址,還是拿一個(gè)字節(jié)數(shù)據(jù)char* |
| 調(diào)試 | 不方便調(diào)試,編譯期間就已經(jīng)替換 | 可調(diào)試 |
| 遞歸 | 不可遞歸 | 可遞歸 |
宏帶副作用參數(shù):
#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
int main()
{
int x = 5;
int y = 8;
int z = MAX(x++, y++);
printf("x=%d y=%d z=%d\n", x, y, z);//輸出的結(jié)果是什么
return 0;
}
//( (x++) > (y++) ? (x++):(y++) )
//輸出結(jié)果:x=6,y=10,z=9
5.命名要求
宏名必須大寫(xiě)
函數(shù)不要全部大寫(xiě)
6. 條件編譯
常見(jiàn)條件編譯指令及應(yīng)用場(chǎng)景
1.單分支
編譯指令:
#if 常量表達(dá)式
? //…
#endif
應(yīng)用場(chǎng)景:
int main()
{
#if 4>2
printf("hello world!\n");
#endif
return 0;
}
//輸出hello world
2.多分支
編譯指令:
#if 常量表達(dá)式
? //…
#elif 常量表達(dá)式
? //…
#else
? //…
#endif
應(yīng)用場(chǎng)景:
int main()
{
#if 1>2
printf("xixi\n");
#elif 4>3
printf("haha\n");
#else
printf("heihei\n");
#endif
return 0;
}
//輸出結(jié)果:haha
可不能和if else選擇語(yǔ)句混淆,多分支條件編譯從上往下走,如果有一個(gè)分支成立,后面分支就不再執(zhí)行;但是選擇語(yǔ)句是從上往下走,有一個(gè)分支成立,繼續(xù)查看后面分支是否成立
3.判斷是否被定義
編譯指令:
1. > #if defined(symbol) 或 #ifdef symbol
2. > #if !defined(symbol) 或 #ifndef symbol
應(yīng)用場(chǎng)景:
```c
#define DEF
int main()
{
#if defined(DEF)
printf("haha\n");
#endif
#ifdef MAX
printf("heihei\n");
#endif
return 0;
}
//輸出結(jié)果:haha
```4.嵌套指令
編譯指令
#if 常量表達(dá)式
#ifdef symbol
//操作
#endif
#elif 常量表達(dá)式
#ifdef symbol
//操作
#endif
#endif
條件編譯指令也支持嵌套,注意#endif結(jié)束本次嵌套
5.刪除宏定義
編譯指令:
#undef
應(yīng)用場(chǎng)景:
#define DEF
int main()
{
#undef DEF//刪除DEF宏定義了
#ifdef DEF
printf("hehe\n");
#endif
return 0;
} 以上就是C語(yǔ)言#define定義宏的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言#define定義宏的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Qt如何實(shí)現(xiàn)輸入框@聯(lián)系人的@檢測(cè)的示例
本文主要介紹了Qt如何實(shí)現(xiàn)輸入框@聯(lián)系人的@檢測(cè)的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例
這篇文章主要為大家介紹了Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
基于C語(yǔ)言實(shí)現(xiàn)的TCP服務(wù)器的流程分析
本文詳細(xì)介紹了如何使用C語(yǔ)言編寫(xiě)一個(gè)簡(jiǎn)單的TCP服務(wù)器,包括創(chuàng)建套接字、綁定IP和端口、監(jiān)聽(tīng)連接請(qǐng)求、接受客戶端連接、數(shù)據(jù)接收與發(fā)送以及關(guān)閉套接字等步驟,最后通過(guò)一個(gè)簡(jiǎn)單的示例展示了TCP服務(wù)器的基本實(shí)現(xiàn)過(guò)程2024-10-10
C語(yǔ)言基于EasyX庫(kù)實(shí)現(xiàn)有顏色彈跳小球
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言基于EasyX庫(kù)實(shí)現(xiàn)有顏色彈跳小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
歸并排序的遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)代碼
以下是對(duì)歸并排序的遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08

