นี่คืออะไร (( ))?


90

ขณะเรียกดูซอร์สโค้ดคอมไพเลอร์ gcc (gcc / c-family / c-pragma.c) ฉันเห็น:

typedef struct GTY(()) align_stack {
  int                  alignment;
  tree                 id;
  struct align_stack * prev;
} align_stack;

และไม่ว่าฉันจะมีการเขียนโปรแกรม C มาหลายปีก็ตามบิตเหล่านี้: (())ยังไม่เป็นที่รู้จักสำหรับฉันเลย ใครช่วยอธิบายความหมายได้บ้าง Google ดูเหมือนจะไม่พบ


แล้วนี่มันGTYอะไรกัน? ไม่ได้กำหนดไว้ในมาตรฐานภาษา ดูรหัสของคุณ
Alexey Frunze

7
GTY เป็นมาโครหรือไม่ ???
Anshul

1
คุณสามารถค้นหาได้ใน Google โดยระบุไซต์ในสตริงข้อความค้นหาดังนี้GTY site:gcc.gnu.org
ericson

คำตอบ:


81

พวกเขาเป็น "เวทมนตร์" ภายใน GCC กล่าวคือเป็นส่วนหนึ่งของการนำคอมไพเลอร์ไปใช้งานเอง

ดูหน้านี้ซึ่งพูดถึงการใช้งาน มาโครใช้เพื่อทำเครื่องหมายประเภทสำหรับวัตถุประสงค์ในการรวบรวมขยะ อาจมีข้อโต้แย้งได้เช่นกันโปรดดูหน้านี้รายละเอียดในนี้

UPDATE :: ตามที่Drew Dormanชี้ให้เห็นในความคิดเห็นวงเล็บคู่ที่แท้จริงไม่ได้เป็นส่วนหนึ่งของ "ความเป็นภายใน" ของการนำ GNU ไปใช้ มักใช้เมื่อคุณต้องการรวบรวมรายการอาร์กิวเมนต์ทั้งหมดเป็นอาร์กิวเมนต์เดียวสำหรับมาโครที่เรียกว่า สิ่งนี้อาจมีประโยชน์ในบางครั้งเมื่อห่อเช่นprintf()ด้วย ดูคำถามนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเทคนิคนี้


5
คำอธิบายของ @Krishnabhadra สามารถพบได้ในเว็บไซต์ที่เชื่อมโยง คำอธิบายเพิ่มเติมเกี่ยวกับคุณสมบัติ GCC ที่เกี่ยวข้องกับ GTY-marker imo จะอยู่นอกเหนือขอบเขตของคำถามและคำตอบนี้
Arne Mertz

30
(())ตัวเองไม่ใช่เวทมนตร์ gcc อนุญาตให้ส่งข้อความที่มีเครื่องหมายจุลภาคไปยังมาโครเป็นอาร์กิวเมนต์เดียว สำหรับคอมไพเลอร์ C / C ++ ใด ๆ
Drew Dormann

45

โดยทั่วไปจะใช้กับมาโครเพื่อป้องกันลูกน้ำ เนื่องจาก#define foo(a,b)การเรียกมาโครfoo(1,2,3)จะผิดกฎหมาย การใช้วงเล็บเสริมเพื่ออธิบายว่าลูกน้ำใดถูกป้องกัน: foo((1,2),3)กับfoo(1,(2,3))เมื่อเทียบกับ

ในกรณีนี้GTYสามารถรับอาร์กิวเมนต์ได้หลายรายการโดยคั่นด้วยเครื่องหมายจุลภาค แต่ต้องป้องกันด้วยเครื่องหมายจุลภาคทั้งหมด นั่นเป็นเหตุผลที่ภายใน()ล้อมรอบข้อโต้แย้งทั้งหมด


2
คุณช่วยอธิบายได้ไหมว่าทำไมใครบางคนจึงควรใช้การโทรดังกล่าว
swaechter

5
เช่น#define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");(ใน C ++ มีโซลูชันที่ดีกว่ามาโครแน่นอน)
MSalters

@Albertus: Macro((Pair<int, int>), ...)ยังจะดีถ้าคุณผ่านแม่แบบในการแมโคร แม้ว่าคุณจะประสบปัญหาเพิ่มเติม แต่การกำจัดวงเล็บภายในมาโคร
BeniBela
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.