为什么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
,例如