3 回答

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊
宏功能:
宏已預(yù)處理
無(wú)類型檢查
代碼長(zhǎng)度增加
使用宏可能會(huì)導(dǎo)致副作用
執(zhí)行速度更快
在將編譯宏名稱替換為宏值之前
在小代碼多次出現(xiàn)的地方很有用
宏也沒有檢查編譯錯(cuò)誤
功能特點(diǎn):
功能已編譯
類型檢查已完成
代碼長(zhǎng)度保持不變
無(wú)副作用
執(zhí)行速度較慢
在函數(shù)調(diào)用期間,發(fā)生控制轉(zhuǎn)移
在大型代碼多次出現(xiàn)的地方很有用
功能檢查編譯錯(cuò)誤

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
副作用很大。這是一個(gè)典型的情況:
#define min(a, b) (a < b ? a : b)
min(x++, y)
擴(kuò)展到:
(x++ < y ? x++ : y)
x在同一條語(yǔ)句中增加兩次。(以及未定義的行為)
編寫多行宏也很麻煩:
#define foo(a,b,c) \
a += 10; \
b += 10; \
c += 10;
他們要求\在每行的末尾。
宏不能“返回”任何東西,除非您將其設(shè)為單個(gè)表達(dá)式:
int foo(int *a, int *b){
side_effect0();
side_effect1();
return a[0] + b[0];
}
除非您使用GCC的expression語(yǔ)句,否則無(wú)法在宏中執(zhí)行此操作。(編輯:雖然您可以使用逗號(hào)運(yùn)算符...但是忽略了它...但是它可能仍然不太可讀。)
操作順序:(由@ouah提供)
#define min(a,b) (a < b ? a : b)
min(x & 0xFF, 42)
擴(kuò)展到:
(x & 0xFF < 42 ? x & 0xFF : 42)
但&優(yōu)先級(jí)低于<。因此0xFF < 42首先被評(píng)估。
- 3 回答
- 0 關(guān)注
- 526 瀏覽
添加回答
舉報(bào)