このマクロを使用して、
int (*max)(int, int) = lambda(int,
(int x, int y) {
return x > y ? x : y;
});
展開する:
int (*max)(int, int) = ({
int _ (int x, int y) { return x > y ? x : y; }
_;
});
中括弧では、GCCの入れ子関数を使用して、目的の操作を実行する関数を作成します。内部スコープ内では、名前は_
です。
次に、interjayによって指摘されているように、GCCのステートメント式が使用されます。事実上、関数_
はポインターに割り当てられますmax
。
そのようなマクロが使用されていない場合、これは別の方法で記述して次のように使用できます。
int val1 = 4;
int val2 = -30;
int perform_operation(int (*op)(int, int)) {
int new_val = op(val1, val2);
val1 = val2;
val2 = new_val;
return new_val;
}
int enclosing_function (void) {
// Create max "lambda"
int (*max)(int, int);
{
// Curly braces limit the scope of _
int _ (int x, int y) { return x > y ? x : y; }
max = _;
}
return perform_operation(max);
}
このコード例では、3つの方法を比較できます。
gcc -E
)展開して、その機能を確認しましたか?