2012-08-31 17 views
15

ものの__attribute__ ((aligned))のようなtypedefの宣言でうまく動作します。私はこれがtypedefを持つ__attribute__ ((__packed__))の場合ではありませんと言う文に遭遇しているtypedef宣言で__attribute__((__packed__))が無視されますか?

typedef struct __attribute__((__aligned__(8))) A { 

    xxx ip ; 
    xxx udp ; 
    xxx ports ; 
} table ; 

!私は関連する質問のいくつかを調べていましたが、そのうちのいくつかはtypedefでpacked属性を使用していました。

今、私たちのコードでは、我々は

typedef struct { 
    xxx ip ; 
    xxx udp ; 
    xxx ports ; 
}__attribute__((packed)) table ; 

を定義するには、上記の宣言は、packed属性宣言をダンプ黙っにコンパイラを作るのか?

PS:はい、私はそれを確認できましたが、私の状況は現時点では異なります。休日とスマートフォンを言うことができます!

答えて

1

ここでは2つのステートメントを組み合わせています。

まず、特定のプロパティを持つ構造体を定義します。 次に、そのエイリアスを作成します。

packed-propertyをエイリアスに割り当てると、このエイリアスで使用される既に作成されたデータ構造は変更されません。 (通常、 "struct bla"と "s_bla" ["typedef struct bla {} s_bla"によって作成された変数を作成し、これらの値を相互に交換することができます)typedefを使用して構造体を変更することができれば、

So:宣言はダンプされます。

0

このようにしてください。これは機能するかもしれません。

struct test 
{ 
unsigned char field1; 
unsigned short field2; 
unsigned long field3; 
}__attribute__((__packed__)); 

typedef struct test test_t; 

test_t var1, var2; 
9

宣言は大丈夫です!

これらは、次のいずれかの方法で宣言できます。

#include <stdio.h> 

    typedef struct __attribute__((packed)) { 
    char old; 
    int ip; 
    int new; 
} NCO; 

int main(void) { 

printf("%d",sizeof(NCO)); 
} 

又は

#include <stdio.h> 
    typedef struct { 
    char old; 
    int ip; 
    int new; 
} __attribute__((packed)) NCO; 

int main(void) { 

printf("%d",sizeof(NCO)); 
} 

__attribute__((packed))キーワードと属性仕様は直ちに構造宣言の右ブレース(})は、以下のことを確認してください。それが他の位置にある場合(たとえば、構造体インスタンスの前にある構造体インスタンスに続く)、コンパイラは__attribute__((packed))を無視して警告メッセージを出します。

私はパックサイズ9を与えていますが、それはhereのように避けて、古い学校構造宣言スタイルを試してみることをお勧めします。

+0

これはうまくいきました、それは信じられないほど危険です。 – Dmitry

6

あなたの宣言は大丈夫ですが、コンパイラ依存です。たとえば、MinGWコンパイラがそれを尊重したい場合は、-mno-ms-bitfieldsパラメータでプログラムをコンパイルする必要があります。このフラグを指定しないと、警告は出されませんが、属性は受け入れられません!

関連する問題