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你的函数声明,例如