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

Stu*_*ook 39 c gcc

GCC __attribute__((...))语法文档表明属性必须用双括号包围,但不能给出这个设计决策的基本原理.

什么实际原因会导致GCC的设计师要求这样做?它与预处理器处理双括号有什么关系吗?

Jan*_*dec 38

为了便于为不同的编译器消除它.如果您有可移植代码,则必须将其删除以供其他编译器使用,因此您可以这样做

#ifndef __GNUC__
#define __attribute__(x)
#endif
Run Code Online (Sandbox Code Playgroud)

问题是属性具有不同数量的参数,您可以在一个__attribute__声明中组合多个属性,但C仅在C99中引入了可变参数宏.使用双括号,上面的定义不需要可变参数宏.


Jen*_*edt 16

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

编辑:使用这种语法,它可以简单地看起来像

#ifdef __GNUC__
# define attribute(X) __attribute__(X)
#else
# define attribute(X)
#endif
Run Code Online (Sandbox Code Playgroud)

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

  • 定义以双下划线开头的宏名称是未定义的行为. (2认同)