3 回答

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

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