函數宏
函數宏可以接收參數和返回值。創建函數宏的過程比較簡單,定義一個包含參數的宏,參數的名字任意。
#define ABS(my_val) ((my_val) <0) ? -(my_val) : (my_val)
宏定義中使用了?:運算符返回正數。宏將在代碼中被完整替代,可能替代許多重複的代碼。宏相比於函數的優勢在於它的速度。在調用宏函數的過程中不存在控制權轉移。函數調用不能作爲宏的參數,例如以下語句不能正常工作:
ABS(cos(36))
內聯函數
內聯函數的函數體比較小,可以被替換。編譯器性能優化器使用內聯。如果編譯器優化功能被禁止,內聯函數無法發揮其作用。
爲使GCC在不考慮優化等級的情況下內聯定義函數,使用always_inline屬性。
void func_test() __attribute__((always_inline))
內聯函數的優勢:
- 因爲它們本質上是函數,導致編譯器進行參數檢查
- 多次調用無風險
- 可以包含多行語句而不用糾纏於 \符號
- 內聯函數有它們自己的變量作用域,並且能夠返回值
- 調試相比於宏更簡單