documentation for GCC's __attribute__((...))
syntax表示属性必须用双括号包围,但没有给出此设计决策的基本原理。为什么GCC的__attribute __((...))语法使用双括号?
什么样的实际原因会导致海湾合作委员会的设计师需要这个?它与预处理器处理双括号有什么关系?
documentation for GCC's __attribute__((...))
syntax表示属性必须用双括号包围,但没有给出此设计决策的基本原理。为什么GCC的__attribute __((...))语法使用双括号?
什么样的实际原因会导致海湾合作委员会的设计师需要这个?它与预处理器处理双括号有什么关系?
为了更容易地消除它为不同的编译器。如果你有移植的代码,你必须要移除这些其他的编译器,让你做
#ifndef __GNUC__
#define __attribute__(x)
#endif
的问题是,属性有不同数量的参数,你可以在一个__attribute__
声明合并多个属性,但是C只介绍C99中的可变宏。使用双括号时,上面的定义不需要可变宏。
可能的想法是,你可以声明一个简单的宏,这有助于在其他C和C++编译器中忽略所有这些。如果你没有第二对括号,那么宏必须与...
一样。因此对于不支持你的编译器会被搞砸。
编辑:有了这个语法它可以简单地像
#ifdef __GNUC__
# define attribute(X) __attribute__(X)
#else
# define attribute(X)
#endif
,然后你会使用attribute
你的函数声明,例如
定义一个以双下划线开头的宏名称是未定义的行为。 – dreamlax
@dreamlax,我知道。我没有说应该这样做,但是我认为它是背后的想法。 –