According to the C FAQ不同的宏功能/內聯方法缺點,基本上有用於C「內聯」代碼3種的實用方法:優點和在c
#define MACRO(arg1, arg2) do { \
/* declarations */ \
stmt1; \
stmt2; \
/* ... */ \
} while(0) /* (no trailing ;) */
或
#define FUNC(arg1, arg2) (expr1, expr2, expr3)
爲了澄清這一個,參數用在表達式中,並且逗號運算符返回最後一個表達式的值。
或
使用inline
聲明其被支撐爲extension to gcc and in the c99 standard。
do { ... } while (0)
方法在Linux內核中被廣泛使用,但是我還沒有經常遇到其他兩種方法。
我特指多語句「函數」,而不是像MAX或MIN這樣的單個語句。
每種方法的優缺點是什麼,爲什麼你會在各種情況下選擇一種?
中間示例沒有多大意義,宏使用名爲arg1和arg2的參數,並且在宏體中使用expr1,expr2和expr3 ? – unwind 2009-10-15 10:06:40
它是有道理的,因爲'argN'可以嵌套在右側的子表達式中。像'(arg1^= arg2,arg2^= arg1,arg1^= arg2)',我想。 – 2009-10-15 10:10:11
除非你測量了你的代碼並知道你需要優化,否則不要打擾:爲所有事情編寫正常的函數。 – pmg 2009-10-15 10:12:12