为什么GCC的__attribute __((...))语法使用双括号?

时间:2011-09-08 08:39:55

标签: c gcc

documentation for GCC's __attribute__((...)) syntax表示属性必须用双括号括起来,但没有给出这个设计决策的理由。

什么实际原因会导致GCC的设计师要求这样做?它与预处理器处理双括号有什么关系吗?

2 个答案:

答案 0 :(得分:38)

为不同的编译器更容易消除它。如果您有可移植代码,则必须将其删除,以便其他编译器执行

#ifndef __GNUC__
#define __attribute__(x)
#endif

问题是属性具有不同数量的参数,您可以在一个__attribute__声明中组合多个属性,但C仅在C99中引入了可变参数宏。使用双括号,上面的定义不需要可变参数宏。

答案 1 :(得分:16)

可能的想法是你可以声明一个简单的宏,它有助于在任何其他C和C ++编译器中忽略所有这些。如果您没有第二对括号,则宏必须与...一对。因此,对于不支持的编译器,你会被搞砸。

编辑:使用此语法,它可以看起来像

#ifdef __GNUC__
# define attribute(X) __attribute__(X)
#else
# define attribute(X)
#endif

然后你会使用attribute作为函数声明,例如