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

GCC的__attribute__((...))语法的文档指出,属性必须用双括号括起来,但是没有给出这个devise决定的基本原理。

什么实际的原因会导致海湾合作委员会的devise师要求这样做? 这与预处理器处理双括号有什么关系?

为了更容易地消除它为不同的编译器。 如果你有可移植的代码,你必须删除他们的其他编译器,所以你这样做

 #ifndef __GNUC__ #define __attribute__(x) #endif 

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

大概的想法是,你可以声明一个简单的macros,这有助于在其他C和C ++编译器中忽略所有这些。 如果你不会有第二对括号,那么这个macros必然会与... 。 所以编译器不支持你会被搞砸。

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

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

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