Saya menemukan kode ini di GitHub tetapi tidak begitu memahaminya:
#define lambda(ret_type, _body) ({ ret_type _ _body _; })
Kemudian:
int (*max)(int, int) = lambda(int,
(int x, int y) {
return x > y ? x : y;
});
int max_value = max(1, 2);
// max_value is 2
Apa yang garis bawah lakukan di dalam #define
dan bagaimana cara mengembalikan pointer fungsi?
gcc -E
) untuk melihat fungsinya?Jawaban:
Menggunakan makro ini,
memperluas ke:
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 pointermax
.Jika makro seperti itu tidak digunakan, ini bisa ditulis secara berbeda dan digunakan sebagai:
Tiga metode dapat dibandingkan dalam contoh kode ini .
sumber
max(4, -30);
bukanapply_binary_op(max, 4, -30);
?Ini disebut pernyataan pernyataan dan membuat "lambda" (atau fungsi bersarang ) dan mengembalikan pointer ke sana. Ini adalah GNU C-specific.
Makro diperluas ke:
Pada
_
akhirnya sepertireturn
.Garis bawah sebenarnya adalah nama fungsi yang dibuat dan "dikembalikan". Ini digunakan karena ini adalah pengidentifikasi yang tidak biasa digunakan (untuk alasan yang baik;
_
sangat mungkin pengidentifikasi deskriptif paling tidak mungkin).Alasan ekspresi pernyataan digunakan adalah sehingga
_
tidak akan ditentukan setelah ruang lingkup pernyataan pernyataan keluar.Jadi, melalui makro:
ret_type
adalah jenis kembalinya "lambda"._
adalah nama fungsi yang digunakan di dalamnya karena itu adalah nama pengidentifikasi yang tidak umum._body
terdiri dari argumen dan tubuh fungsi. Trailing_
"mengembalikan" "lambda".Kode ini ditemukan di Let's Destroy C (yang merupakan nama yang sesuai). Anda seharusnya tidak menggunakannya. Ini akan membuat kode Anda hanya berfungsi pada kompiler yang mendukung ekstensi GNU C. Sebaliknya, cukup tulis fungsi atau makro.
Jika Anda menggunakan konstruksi seperti ini banyak atau menginginkan lebih banyak fitur, saya sarankan menggunakan C ++. Dengan C ++ Anda dapat melakukan sesuatu yang mirip dengan ini dan memiliki kode portabel.
sumber