在浏览gcc编译器源代码(gcc / c-family / c-pragma.c)时,我看到:
typedef struct GTY(()) align_stack {
int alignment;
tree id;
struct align_stack * prev;
} align_stack;
并且无论我有多少C编程岁月,这些位:(())
对我来说完全不为人知。有人可以解释一下他们的意思吗?谷歌似乎没有找到它。
答案 0 :(得分:81)
它们是GCC内部的“魔力”,即编译器实现本身的一部分。
请参阅this page,了解其用途。宏用于标记垃圾收集目的的类型。也可以有参数,详见this page。
UPDATE ::正如Drew Dorman在评论中指出的那样,实际的双括号不是GNU实现的“内部性”的一部分;当你想要将整个参数列表收集到被调用宏的单个参数中时,它们通常被使用。这有时在包装时很有用。 printf()
也是。 See this question, for more on this technique
答案 1 :(得分:45)
通常,它与宏一起使用来屏蔽逗号。给定#define foo(a,b)
,宏调用foo(1,2,3)
将是非法的。使用一对额外的括号可以明确屏蔽哪个逗号:foo((1,2),3)
与foo(1,(2,3))
。
在这种情况下,GTY
可以使用逗号分隔的多个参数,但所有这些逗号都必须被屏蔽。这就是为什么内部()
包围所有参数。