สิ่งนี้เรียกว่าการแสดงออกของคำสั่งและสร้าง "แลมบ์ดา" (หรือฟังก์ชั่นที่ซ้อนกัน ) และส่งกลับตัวชี้ไปที่มัน เป็น GNU C-specific
แมโครขยายเป็น:
int (*max)(int, int) = ({ int _ (int x, int y) { return x > y ? x : y; } _; })
ที่สิ้นสุดเป็นเหมือน_
return
เครื่องหมายขีดล่างจริง ๆ แล้วเป็นชื่อของฟังก์ชันที่สร้างขึ้นและ "ส่งคืน" มันถูกใช้เพราะมันเป็นตัวบ่งชี้ที่ใช้งานผิดปกติ (สำหรับเหตุผลที่ดี_
อาจเป็นตัวบ่งชี้ที่อธิบายได้น้อยที่สุด)
เหตุผลที่นิพจน์คำสั่งถูกใช้ดังนั้น_
จะไม่ถูกกำหนดหลังจากขอบเขตของการแสดงออกของคำสั่งจบการทำงาน
ดังนั้นจะผ่านมาโคร:
#define lambda(ret_type, _body) ({ ret_type _ _body _; })
ret_type
เป็นชนิดส่งคืนของ "แลมบ์ดา" _
เป็นชื่อของฟังก์ชั่นที่ใช้ภายในเพราะเป็นชื่อตัวระบุที่ผิดปกติ _body
ประกอบด้วยข้อโต้แย้งและเนื้อหาของฟังก์ชัน ส่วนท้าย_
"ส่งคืน" the "lambda"
รหัสนี้พบได้ที่Let's Destroy C (ซึ่งเป็นชื่อที่เหมาะสม) คุณไม่ควรใช้มัน มันจะทำให้โค้ดของคุณใช้งานได้กับคอมไพเลอร์ที่รองรับส่วนขยาย GNU C เท่านั้น ให้เขียนฟังก์ชันหรือแมโครแทน
หากคุณใช้โครงสร้างเช่นนี้มากหรือต้องการคุณสมบัติเพิ่มเติมฉันขอแนะนำให้ใช้ C ++ ด้วย C ++ คุณสามารถทำสิ่งที่คล้ายกับสิ่งนี้และมีรหัสพกพา
gcc -E
) เพื่อดูว่ามันทำอะไร?