亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

內聯函數與預處理宏

內聯函數與預處理宏

C++
嗶嗶one 2019-10-12 12:07:20
內聯函數與預處理宏內聯函數與預處理宏有何不同?
查看完整描述

3 回答

?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

預處理宏只是應用于代碼的替換模式。它們幾乎可以在代碼中的任何地方使用,因為它們在任何編譯開始之前都會被展開替換。

內聯功能是將身體直接注入其呼叫站點的實際功能。它們只能在函數調用合適的情況下使用。

現在,關于在類似函數的上下文中使用宏和內聯函數,建議如下:

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



查看完整回答
反對 回復 2019-10-14
?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

首先,預處理器宏只是編譯前的代碼中的“復制粘貼”。所以沒有類型檢查,還有一些副作用會出現

例如,如果要比較2個值:

#define max(a,b) ((a<b)?b:a)

如果使用max(a++,b++)例如(ab將增加兩次)。相反,使用(例如)

inline int max( int a, int b) { return ((a<b)?b:a); }



查看完整回答
反對 回復 2019-10-14
?
拉丁的傳說

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`
  • 返回關鍵字不能像函數那樣在宏中使用來返回值。

  • 內聯函數可以重載。

  • 傳遞給宏的令牌可以使用操作符#稱為令牌粘貼操作符連接起來。

  • 宏通常用于代碼重用,其中作為內聯函數用于消除函數調用期間的時間開銷(多余時間)(避免跳轉到子例程)。



查看完整回答
反對 回復 2019-10-14
  • 3 回答
  • 0 關注
  • 384 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號