我现在正在阅读一些 C 代码。并且对“#define someting”表达式不是很清楚。
例如,我看到了这段代码:
typedef enum cairo_path_op {
CAIRO_PATH_OP_MOVE_TO = 0,
CAIRO_PATH_OP_LINE_TO = 1,
CAIRO_PATH_OP_CURVE_TO = 2,
CAIRO_PATH_OP_CLOSE_PATH = 3
} __attribute__ ((packed)) cairo_path_op_t; /* Don't want 32 bits if we can avoid it. */
#ifndef __GNUC__
#define __attribute__(x)
#endif
我注意到“__属性__(x)”。因为在其他头文件中,“__属性__(x)”定义为没有值,但是它如何在枚举“cairo_path_op”定义中生效?
最佳答案
这是出于可移植性的原因。
__attribute__()
是一个 GCC 扩展,用于修改函数、变量、类型等的各种属性和行为。
如果非 GCC 兼容编译器尝试编译使用此扩展的代码,它将无法执行此操作,并且会引发语法错误。
为了避免这种情况,代码作者让预处理器将此关键字替换为空 if __GNUC__
未定义(即,如果编译器不是与 GCC 兼容的编译器),因此代码可以构建在更多种类的平台上。
关于c - #定义一个没有值的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14672667/