这是什么 (( ))?

时间:2013-02-15 08:55:29

标签: c++ c

在浏览gcc编译器源代码(gcc / c-family / c-pragma.c)时,我看到:

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

并且无论我有多少C编程岁月,这些位:(())对我来说完全不为人知。有人可以解释一下他们的意思吗?谷歌似乎没有找到它。

2 个答案:

答案 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可以使用逗号分隔的多个参数,但所有这些逗号都必须被屏蔽。这就是为什么内部()包围所有参数。