我现在读了一些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”定义中生效?
答案 0 :(得分:1)
这是出于便携的原因。
__attribute__()
是一个GCC扩展,用于修改函数,变量,类型等的各种属性和行为。
如果非GCC兼容的编译器尝试编译使用此扩展的代码,它将无法执行此操作并将引发语法错误。
为了避免这种情况,如果未定义__GNUC__
(即编译器不是GCC兼容的),代码的作者会使预处理器替换此关键字,以便代码构建在更多种类的平台上。