6

これら 2 つの構造体定義が正常にコンパイルされるのはなぜですか。

struct foo {
    int a;
} __attribute__((packed));

typedef struct __attribute__((packed)) {
    int a;
} bar;

これは警告を出しますが:

typedef struct {
    int a;
} baz __attribute__((packed));


warning: ‘packed’ attribute ignored [-Wattributes]

そして、これはエラーと警告を出します:

typedef struct qux __attribute__((packed)) {
    int a;
} qux;

error: expected identifier or ‘(’ before ‘{’ token
warning: data definition has no type or storage class [enabled by default]

初心者の C プログラマーとして、最後の 2 つの定義が機能しないという事実は、言語設計者/コンパイラー作成者のかなり恣意的な選択のように思えます。これには理由がありますか?gcc 4.7.3 を使用しています。

4

4 に答える 4

7
typedef struct __attribute__((packed)) {
    int a;
} bar;

typedef struct {
    int a;
} baz __attribute__((packed));

最初に、「メンバーaを持つ属性がパックされたこの匿名構造を検討してください。次に、この構造のエイリアスを作成し、その「バー」という名前を付けます」と述べました。構造体を匿名で記述せずに型定義する必要のない通常の構文は次のとおりです。

struct bar { int a; };

2番目の宣言で、「メンバーaを持つこの匿名構造を検討してください。次に、この構造のエイリアスを作成し、「パックされたbaz」という名前を付けます」と述べました。

構造定義ではなく、typedef のエイリアスに属性を適用しようとしているため、機能しません。

typedef <entity> <alias>;

構造体を記述するために「typedef」構文を使用することを提案した人にヒットを与えることをお勧めします:)

于 2013-06-02T04:58:52.067 に答える
0

マニュアルですべて非常によく説明されているため、これはかなり奇妙な質問です。ただし、恣意的なものは何もありません。この組み込みキーワードの完全な使用法を調べているわけではありません。

__attribute__(())汎用の gcc 拡張機能です。関数属性、型属性、変数属性があります。

単語を配置する場所によって、その単語__attribute__が何に適用されるかが決まります。特定の宣言に複数の s が含まれる可能性が__attribute__あるため、内部解析を容易にするために、その一部を構文的に受け入れられなくすることは恣意的ではありません。

于 2013-06-02T04:02:13.463 に答える