內聯函數與預處理宏內聯函數與預處理宏有何不同?
3 回答

炎炎設計
TA貢獻1808條經驗 獲得超4個贊
宏不是類型安全的,無論它們是否同步正確,都可以展開它們-編譯階段將報告由宏展開問題造成的錯誤。 宏可以在您不期望的上下文中使用,從而導致問題 宏更靈活,因為它們可以擴展其他宏,而內聯函數并不一定這樣做。 宏可能會產生副作用,因為它們的擴展,因為輸入表達式被復制到模式中的任何位置。 內聯函數并不總是被保證是內聯的-有些編譯器只在發布版本中或者當它們被專門配置這樣做時才會這樣做。此外,在某些情況下,內聯可能是不可能的。 內聯函數可以為變量(特別是靜態變量)提供范圍,預處理宏只能在代碼塊{.}中這樣做,而靜態變量的行為方式并不完全相同。

鳳凰求蠱
TA貢獻1825條經驗 獲得超4個贊
#define max(a,b) ((a<b)?b:a)
max(a++,b++)
a
b
inline int max( int a, int b) { return ((a<b)?b:a); }

拉丁的傳說
TA貢獻1789條經驗 獲得超8個贊
在宏調用期間不進行類型檢查,而在函數調用期間進行類型檢查。 由于重新評估參數和操作順序,在宏擴展過程中可能會出現不期望的結果和效率低下。例如 #define MAX(a,b) ((a)>(b) ? (a) : (b))int i = 5, j = MAX(i++, 0);
會導致 int i = 5, j = ((i++)>(0) ? (i++) : (0));
宏參數在宏展開之前不進行計算。 #define MUL(a, b) a*bint main(){ // The macro is expended as 2 + 3 * 3 + 5, not as 5*8 printf("%d", MUL(2+3, 3+5)); return 0;}// Output: 16`
返回關鍵字不能像函數那樣在宏中使用來返回值。 內聯函數可以重載。 傳遞給宏的令牌可以使用操作符#稱為令牌粘貼操作符連接起來。 宏通常用于代碼重用,其中作為內聯函數用于消除函數調用期間的時間開銷(多余時間)(避免跳轉到子例程)。
- 3 回答
- 0 關注
- 384 瀏覽
添加回答
舉報
0/150
提交
取消