#define没有值的对象

时间:2013-02-03 12:55:00

标签: c typedef

我现在读了一些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”定义中生效?

1 个答案:

答案 0 :(得分:1)

这是出于便携的原因。

__attribute__()是一个GCC扩展,用于修改函数,变量,类型等的各种属性和行为。

如果非GCC兼容的编译器尝试编译使用此扩展的代码,它将无法执行此操作并将引发语法错误。

为了避免这种情况,如果未定义__GNUC__(即编译器不是GCC兼容的),代码的作者会使预处理器替换此关键字,以便代码构建在更多种类的平台上。