90

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

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

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

4

2 回答 2

82

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

请参阅此页面,其中讨论了它们的使用。该宏用于标记用于垃圾收集目的的类型。也可以有参数,请参阅此页面了解详细信息。

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

于 2013-02-15T08:57:02.993 回答
44

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

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

于 2013-02-15T10:18:00.930 回答