0

私は今、いくつかのcコードを読んでいます。そして、「#definesometing」の表現についてはあまり明確ではありません。

たとえば、私はこのコードを見ました:

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と互換性のないコンパイラがこの拡張機能を使用するコードをコンパイルしようとすると、コンパイルできず、構文エラーがスローされます。

これを回避するために、コードの作成者は、__GNUC__定義されていない場合(つまり、コンパイラがGCC互換ではない場合)、プリプロセッサにこのキーワードを何も置き換えさせないため、コードはさまざまなプラットフォームでビルドされます。

于 2013-02-03T12:59:15.213 に答える