GCC的__attribute__((...))
语法文档表明,属性必须用双括号括起来,但并未说明设计决策的理由。
GCC的设计者要求使用双括号的实际原因是什么?这与预处理器处理双括号有关吗?
GCC的__attribute__((...))
语法文档表明,属性必须用双括号括起来,但并未说明设计决策的理由。
GCC的设计者要求使用双括号的实际原因是什么?这与预处理器处理双括号有关吗?
为了更方便地消除不同编译器的影响。如果您拥有可移植的代码,您需要将其从其他编译器中删除,因此您需要这样做。
#ifndef __GNUC__
#define __attribute__(x)
#endif
问题在于属性的参数数量不同,并且可以将多个属性组合在一个 __attribute__
声明中,但是C语言直到C99才引入了可变参数宏。使用双括号,上述定义不需要可变参数宏。
问题在于属性的参数数量不同,而且您可以在一个 __attribute__
声明中组合多个属性,但是C语言直到C99才引入了可变参数宏。通过加上额外一层的括号,上述定义无需使用可变参数宏。
可能的想法是,你可以声明一个简单的宏,以帮助在任何其他 C 和 C++ 编译器中忽略所有这些内容。如果没有第二对括号,那么该宏必须是一个带有 ...
的宏。因此,对于不支持该功能的编译器,你将会受到影响。
编辑: 使用这种语法,它看起来非常简单
#ifdef __GNUC__
# define attribute(X) __attribute__(X)
#else
# define attribute(X)
#endif
接下来您将会在函数声明中使用attribute
,例如: