这是什么(())?

问题描述:

同时通过gcc编译器的源代码浏览器(gcc/C系列/ C-pragma.c)我看到:这是什么(())?

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

也不管有很多的C编程几年我身后的,这些位:(())是我完全不知道。有人可以解释他们的意思吗?谷歌似乎没有找到它。

+0

这是什么'GTY'?它没有在语言标准中定义。查看你的代码。 – 2013-02-15 08:57:49

+7

是GTY宏? – Anshul 2013-02-15 08:59:51

+1

你可以通过在查询字符串中指定网站在Google上找到它:GTY网站:gcc.gnu.org' – ericson 2013-02-20 01:38:07

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

查看this page谈论它们的用法。该宏用于标记垃圾收集目的的类型。也可以有参数,详见this page

UPDATE ::正如Drew Dorman在评论中指出的,实际的双括号不是GNU实现的“内在性”的一部分;当你想将所有参数列表集中到一个被调用的宏的参数中时,它们通常被使用。这在包装例如包装时可能是有用的。 printf()See this question, for more on this technique

+11

希望更多解释如下.. – Krishnabhadra 2013-02-15 08:59:38

+5

@Krishnabhadra解释可以在链接的网站上找到。关于与GTY-marker imo相关的GCC特征的进一步解释将超出这个特定问题和答案的范围。 – 2013-02-15 09:06:09

+29

'(())'本身**不是** gcc魔术。它允许包含逗号的文本作为单个参数传递给宏。对于任何C/C++编译器。 – 2013-02-15 16:36:18

通常,它与宏一起用来屏蔽逗号。鉴于#define foo(a,b),宏调用foo(1,2,3)将是非法的。使用额外的一对括号说明哪个逗号被屏蔽:foo((1,2),3)foo(1,(2,3))

在这种情况下,GTY可以采用多个参数,用逗号分隔,但所有这些逗号必须被屏蔽。这就是为什么围绕所有参数的内部()

+2

你能解释为什么有人应该使用这种电话吗? – swaechter 2013-02-15 11:11:03

+5

例如'#define PRINT_A_LOT(a,b)printf(“prefix \ n”); printf a;的printf( “缀\ n”); printf b; printf(“suffix \ n”);'(当然,在C++中有比宏更好的解决方案)。 – MSalters 2013-02-15 12:52:57

+0

@Albertus:如果你将模板传递给一个宏'Macro((Pair ),...)',也会很好。尽管如此,你还是遇到了额外的麻烦,要摆脱宏中的括号 – BeniBela 2013-02-21 13:46:40