web-dev-qa-db-ja.com

typedef宣言で__attribute__((__packed__))は無視されますか?

__attribute__ ((aligned))は次のようなtypedef宣言でうまく機能しますが:

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

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

Typedefでの__attribute__ ((__packed__))の場合はそうではないというステートメントに出くわしました!私は関連する質問のいくつかを検討していましたが、それらのいくつかは、コードと一致するtypedefでpack属性を使用しました。

今、私たちのコードで定義します

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

上記の宣言により、コンパイラはサイレントにパックされた属性宣言をダンプしますか?

PS:はい、確認できたかもしれませんが、現時点では状況が異なります。休暇とスマートフォンについて説明しましょう。

19
Borrito

宣言は私に大丈夫だと思われます!

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

_#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))キーワードと属性の指定が、構造体宣言の右中括弧(})の直後にあることを確認してください。それが他の位置にある場合(たとえば、構造体インスタンスの前ではなく、構造体インスタンスの後に続く場合)、コンパイラーはignore__attribute__((packed))を無視して警告メッセージを発行します。

パックされたサイズ_9_が得られますが、記載されているようにそれを避けた方が良いと思います here で、古い学校の構造宣言スタイルを試してください。

14
user1471

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

8
klasyc

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

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

パックプロパティをエイリアスに割り当てると、このエイリアスで使用される、既に作成されているデータ構造は変更されません。 (通常、「struct bla」と「s_bla」[「typedef struct bla {} s_bla」によって作成された]を使用して変数を作成し、これらの値を相互に交換できます。typedefを使用して構造体を変更できる場合、この一貫性壊れます。)

So:宣言は破棄されます。

1
Nippey

このようにしてみてください。これでうまくいくかもしれません。

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

typedef struct test test_t;

test_t var1, var2;
0
Chaithra