这是什么 (( ))?


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 2013年

1
您可以通过在查询字符串中指定站点,在Google上找到它,如下所示:GTY site:gcc.gnu.org
ericson

Answers:


81

它们是GCC内部的“魔术”,即编译器实现本身的一部分。

请参阅此页面,讨论其用法。宏用于标记类型以进行垃圾回收。也可以有参数,请参阅此页面以获取详细信息。

UPDATE ::正如Drew Dorman在评论中指出的那样,实际的双括号不是GNU实现的“内部性”的一部分。当您想将整个参数列表收集到被调用宏的单个参数中时,通常使用它们。有时在包装时也很有用printf()有关此技术的更多信息,请参见此问题


5
@Krishnabhadra的解释可以在链接的网站上找到。有关与GTY标记imo相关的GCC功能的进一步说明将超出此特定问答的范围。
Arne Mertz

30
(())本身不是 gcc的魔法。它允许包含逗号的文本作为单个参数传递给宏。对于任何C / C ++编译器。
德鲁·多曼

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,那也很好Macro((Pair<int, int>), ...)。尽管那样您会遇到其他麻烦,但要摆脱宏中的括号
BeniBela
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.