函數宏與內聯函數

函數宏


函數宏可以接收參數和返回值。創建函數宏的過程比較簡單,定義一個包含參數的宏,參數的名字任意。

#define ABS(my_val) ((my_val) <0) ? -(my_val) : (my_val)

宏定義中使用了?:運算符返回正數。宏將在代碼中被完整替代,可能替代許多重複的代碼。宏相比於函數的優勢在於它的速度。在調用宏函數的過程中不存在控制權轉移。函數調用不能作爲宏的參數,例如以下語句不能正常工作:

ABS(cos(36))

內聯函數


內聯函數的函數體比較小,可以被替換。編譯器性能優化器使用內聯。如果編譯器優化功能被禁止,內聯函數無法發揮其作用。

爲使GCC在不考慮優化等級的情況下內聯定義函數,使用always_inline屬性。

void func_test() __attribute__((always_inline))

內聯函數的優勢:

  • 因爲它們本質上是函數,導致編譯器進行參數檢查
  • 多次調用無風險
  • 可以包含多行語句而不用糾纏於 \符號
  • 內聯函數有它們自己的變量作用域,並且能夠返回值
  • 調試相比於宏更簡單
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章