C FAQ によると、Cでコードを「インライン化」するには、基本的に 3 つの実用的な方法があります。
#define MACRO(arg1, arg2) do { \
/* declarations */ \
stmt1; \
stmt2; \
/* ... */ \
} while(0) /* (no trailing ; ) */
また
#define FUNC(arg1, arg2) (expr1, expr2, expr3)
これを明確にするために、引数は式で使用され、カンマ演算子は最後の式の値を返します。
また
gcc の拡張としてサポートされ、c99 標準でinline
サポートされている宣言を使用します。
このdo { ... } while (0)
方法は Linux カーネルで広く使用されていますが、私は他の 2 つの方法に遭遇したことはほとんどありません。
MAX や MIN のような単一ステートメントの関数ではなく、複数ステートメントの「関数」について具体的に言及しています。
それぞれの方法の長所と短所は何ですか? また、さまざまな状況でどちらか一方を選択するのはなぜですか?