【发布时间】:2011-11-12 19:21:12
【问题描述】:
documentation for GCC's __attribute__((...)) syntax 表示属性必须用双括号括起来,但没有给出此设计决策的理由。
什么实际原因会导致 GCC 的设计者要求这样做?跟预处理器对双括号的处理有关系吗?
【问题讨论】:
documentation for GCC's __attribute__((...)) syntax 表示属性必须用双括号括起来,但没有给出此设计决策的理由。
什么实际原因会导致 GCC 的设计者要求这样做?跟预处理器对双括号的处理有关系吗?
【问题讨论】:
可能的想法是,您可以声明一个简单的宏,有助于在任何其他 C 和 C++ 编译器中忽略所有这些。如果您没有第二对括号,则该宏必然与... 是一个。所以对于不支持的编译器,你会被搞砸的。
编辑:使用这种语法,它看起来就像
#ifdef __GNUC__
# define attribute(X) __attribute__(X)
#else
# define attribute(X)
#endif
然后您将使用attribute 进行函数声明,例如
【讨论】:
为了让不同的编译器更容易消除它。如果你有可移植的代码,你必须为其他编译器删除它们,所以你这样做
#ifndef __GNUC__
#define __attribute__(x)
#endif
问题是属性有不同数量的参数,你可以在一个__attribute__声明中组合多个属性,但是C在C99中只引入了可变参数宏。使用双括号,上述定义不需要可变参数宏。
【讨论】: