提问



GCC__attribute__((...))语法的文档表明属性必须用双括号括起来,但没有给出这个设计决策的基本原理。[7]


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

最佳参考


为了便于为不同的编译器消除它。如果您有可移植代码,则必须将其删除以供其他编译器使用,这样就可以了


#ifndef __GNUC__
#define __attribute__(x)
#endif


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

其它参考1


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


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


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


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