这是什么 (( ))?

Fer*_*eak 90 c c++

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

typedef struct GTY(()) align_stack {
  int                  alignment;
  tree                 id;
  struct align_stack * prev;
} align_stack;
Run Code Online (Sandbox Code Playgroud)

而且无论我有多少C编程年,我(())都知道这些:我还完全不知道.有人可以解释一下他们的意思吗?谷歌似乎没有找到它.

unw*_*ind 81

它们是GCC内部的"魔力",即编译器实现本身的一部分.

请参阅此页面,了解它们的用途.该宏用于标记垃圾收集目的的类型.也可以有参数,请参阅此页面了解详情.

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

  • `(())`本身就是**不是**gcc魔法.它允许包含逗号的文本作为单个参数传递给宏.对于任何C/C++编译器. (30认同)
  • @Krishnabhadra解释可以在链接网站上找到.关于与GTY标记imo相关的GCC特征的进一步解释将超出该特定问题和答案的范围. (5认同)

MSa*_*ers 45

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

在这种情况下,GTY可以使用逗号分隔的多个参数,但必须屏蔽所有这些逗号.这就是为什么内在()环绕所有论点.

  • 例如`#define PRINT_A_LOT(a,b)printf("prefix \n"); printf a; 的printf( "缀\n"); printf b; printf("suffix \n");`(在C++中,有比mac更好的解决方案,当然). (5认同)
  • 你能解释为什么有人应该使用这样的电话吗? (2认同)