0

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

4

1 回答 1

1

这是出于便携性的原因。

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

如果不兼容 GCC 的编译器尝试编译使用此扩展的代码,它将无法这样做并且会引发语法错误。

为了避免这种情况,代码的作者让预处理器将此关键字替换为nothing if __GNUC__is not defined(即,如果编译器不是GCC兼容的),这样代码就可以构建在更多种类的平台上。

于 2013-02-03T12:59:15.213 回答