这是什么(())?
同时通过gcc编译器的源代码浏览器(gcc/C系列/ C-pragma.c)我看到:这是什么(())?
typedef struct GTY(()) align_stack {
int alignment;
tree id;
struct align_stack * prev;
} align_stack;
也不管有很多的C编程几年我身后的,这些位:(())
是我完全不知道。有人可以解释他们的意思吗?谷歌似乎没有找到它。
它们是GCC内部的“魔术”,即编译器实现本身的一部分。
查看this page谈论它们的用法。该宏用于标记垃圾收集目的的类型。也可以有参数,详见this page。
UPDATE ::正如Drew Dorman在评论中指出的,实际的双括号不是GNU实现的“内在性”的一部分;当你想将所有参数列表集中到一个被调用的宏的参数中时,它们通常被使用。这在包装例如包装时可能是有用的。 printf()
。 See this question, for more on this technique。
希望更多解释如下.. – Krishnabhadra 2013-02-15 08:59:38
@Krishnabhadra解释可以在链接的网站上找到。关于与GTY-marker imo相关的GCC特征的进一步解释将超出这个特定问题和答案的范围。 – 2013-02-15 09:06:09
'(())'本身**不是** 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
可以采用多个参数,用逗号分隔,但所有这些逗号必须被屏蔽。这就是为什么围绕所有参数的内部()
。
你能解释为什么有人应该使用这种电话吗? – swaechter 2013-02-15 11:11:03
例如'#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
@Albertus:如果你将模板传递给一个宏'Macro((Pair
这是什么'GTY'?它没有在语言标准中定义。查看你的代码。 – 2013-02-15 08:57:49
是GTY宏? – Anshul 2013-02-15 08:59:51
你可以通过在查询字符串中指定网站在Google上找到它:GTY网站:gcc.gnu.org' – ericson 2013-02-20 01:38:07