2011-09-08 48 views

回答

37

为了更容易地消除它为不同的编译器。如果你有移植的代码,你必须要移除这些其他的编译器,让你做

#ifndef __GNUC__ 
#define __attribute__(x) 
#endif 

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

15

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

编辑:有了这个语法它可以简单地像

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

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

+2

定义一个以双下划线开头的宏名称是未定义的行为。 – dreamlax

+0

@dreamlax,我知道。我没有说应该这样做,但是我认为它是背后的想法。 –