C語言#define定義宏的使用詳解
1.宏是什么
#define 機制包括了一個規(guī)定,允許把參數(shù)替換到文本中,這種實現(xiàn)通常稱為宏(macro)或定義宏(define macro)。
語法:
#define name( parament-list ) stuff
parament-list:是一個由逗號隔開的符號表。
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; }
簡要說明:宏已經(jīng)被替換
分位三個階段:預(yù)編譯、編譯、匯編
3. 宏的注意事項
定義什么替換什么
來看這一例:
#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ù) |
---|---|---|
代碼長度 | 如果多次調(diào)用,多次替換,如果是大長度宏其長度很長 | 函數(shù)只實現(xiàn)一次可以多次使用,如果多次調(diào)用,長度只有一份 |
執(zhí)行速度 | 更快 | 函數(shù)調(diào)用和開辟都會有額外開銷 |
操作符優(yōu)先級 | 必須每個參數(shù)加上括號,否則操作符優(yōu)先級可能會產(chǎn)生不可預(yù)料的后果 | 函數(shù)參數(shù)只在函數(shù)調(diào)用的時候求值一次,它的結(jié)果值傳遞給函數(shù)。表達式的求值結(jié)果更容易預(yù)測 |
帶有副作用參數(shù) | 多次調(diào)用宏會有不可預(yù)料的后果 | 函數(shù)參數(shù)只在傳參的時候求值一次,結(jié)果更容易控制,只需關(guān)注是傳值還是傳址 |
參數(shù)類型 | 宏的參數(shù)和類型無關(guān),可以使用與任何參數(shù)類型 | 函數(shù)參數(shù)與類型有關(guān),類型取決于使用目的,傳值,傳址,還是拿一個字節(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.命名要求
宏名必須大寫
函數(shù)不要全部大寫
6. 條件編譯
常見條件編譯指令及應(yīng)用場景
1.單分支
編譯指令:
#if 常量表達式
? //…
#endif
應(yīng)用場景:
int main() { #if 4>2 printf("hello world!\n"); #endif return 0; } //輸出hello world
2.多分支
編譯指令:
#if 常量表達式
? //…
#elif 常量表達式
? //…
#else
? //…
#endif
應(yī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選擇語句混淆,多分支條件編譯從上往下走,如果有一個分支成立,后面分支就不再執(zhí)行;但是選擇語句是從上往下走,有一個分支成立,繼續(xù)查看后面分支是否成立
3.判斷是否被定義
編譯指令:
1. > #if defined(symbol) 或 #ifdef symbol
2. > #if !defined(symbol) 或 #ifndef symbol
應(yī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 常量表達式
#ifdef symbol
//操作
#endif
#elif 常量表達式
#ifdef symbol
//操作
#endif
#endif
條件編譯指令也支持嵌套,注意#endif結(jié)束本次嵌套
5.刪除宏定義
編譯指令:
#undef
應(yīng)用場景:
#define DEF int main() { #undef DEF//刪除DEF宏定義了 #ifdef DEF printf("hehe\n"); #endif return 0; }
以上就是C語言#define定義宏的使用詳解的詳細內(nèi)容,更多關(guān)于C語言#define定義宏的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++結(jié)構(gòu)體初始化的10種寫法總結(jié)
這篇文章主要為大家詳細介紹了10種C++中結(jié)構(gòu)體初始化的寫法,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04C語言將數(shù)組中元素的數(shù)排序輸出的相關(guān)問題解決
這篇文章主要介紹了C語言將數(shù)組中元素的數(shù)排序輸出的相關(guān)問題解決,文中的題目是將元素連接起來排成一個數(shù)并要求出這類結(jié)果中數(shù)最小的一個,需要的朋友可以參考下2016-03-03