GCC的__attribute__((...))语法为什么要使用双括号?

43

GCC的__attribute__((...))语法文档表明,属性必须用双括号括起来,但并未说明设计决策的理由。

GCC的设计者要求使用双括号的实际原因是什么?这与预处理器处理双括号有关吗?

2个回答

41

为了更方便地消除不同编译器的影响。如果您拥有可移植的代码,您需要将其从其他编译器中删除,因此您需要这样做。

#ifndef __GNUC__
#define __attribute__(x)
#endif
问题在于属性的参数数量不同,并且可以将多个属性组合在一个 __attribute__ 声明中,但是C语言直到C99才引入了可变参数宏。使用双括号,上述定义不需要可变参数宏。

问题在于属性的参数数量不同,而且您可以在一个 __attribute__ 声明中组合多个属性,但是C语言直到C99才引入了可变参数宏。通过加上额外一层的括号,上述定义无需使用可变参数宏。


18

可能的想法是,你可以声明一个简单的宏,以帮助在任何其他 C 和 C++ 编译器中忽略所有这些内容。如果没有第二对括号,那么该宏必须是一个带有 ... 的宏。因此,对于不支持该功能的编译器,你将会受到影响。

编辑: 使用这种语法,它看起来非常简单

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

接下来您将会在函数声明中使用attribute,例如:


2
定义以双下划线开头的宏名称是未定义行为。 - dreamlax
1
@dreamlax,我知道。我并没有说应该这样做,但我认为背后的想法是什么。 - Jens Gustedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接