Menggunakan makro ini,
int (*max)(int, int) = lambda(int,
(int x, int y) {
return x > y ? x : y;
});
memperluas ke:
int (*max)(int, int) = ({
int _ (int x, int y) { return x > y ? x : y; }
_;
});
Dalam kurung kurawal, ini menggunakan Nested Functions GCC untuk membuat fungsi yang melakukan operasi yang diinginkan. Di dalam lingkup batin, ia memiliki nama _
.
Kemudian, seperti dicatat oleh interjay, Pernyataan Ekspresi GCC digunakan. Secara efektif, fungsi _
ditugaskan ke pointer max
.
Jika makro seperti itu tidak digunakan, ini bisa ditulis secara berbeda dan digunakan sebagai:
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);
}
Tiga metode dapat dibandingkan dalam contoh kode ini .
gcc -E
) untuk melihat fungsinya?