23

ただし、次のようなtypedef__attribute__ ((aligned))宣言でうまく機能します。

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

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

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

さて、私たちのコードでは定義します

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

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

PS : はい、確認できたかもしれませんが、私の状況は今のところ異なります。たとえば、休日とスマートフォンです。

4

4 に答える 4

22

宣言は問題ないようです。ただし、サイレント属性の破棄を避けるために、次のいずれかに従うようにしてください。

#include <stdio.h>

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

int main(void)
{ 
    printf("%zu", sizeof(NCO));
} 

また

#include <stdio.h> 

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

int main(void)
{
    printf("%zu", sizeof(NCO));
} 

__attribute__((packed))キーワードと属性の指定が構造体宣言の右中かっこ (}) の直後にあることを確認してください。他の位置にある場合 (構造体インスタンスの前ではなく構造体インスタンスの後にあるなど)、コンパイラは無視 __attribute__((packed))して警告メッセージを発行します。

パックされたサイズが得られますが、ここで述べられているようにそれを避けて、古い学校の構造体宣言スタイルを試す9方がよいと思います。

于 2012-08-31T14:32:20.300 に答える
10

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

于 2016-05-12T10:51:31.790 に答える
4

ここでは 2 つのステートメントを結合しています。

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

pack-property をエイリアスに割り当てても、このエイリアスで使用される作成済みのデータ構造は変更されません。(通常、「struct bla」と「s_bla」[「typedef struct bla {} s_bla」で作成] で変数を作成し、これらの値を相互に交換できます。typedef を使用して構造体を変更できる場合、この一貫性は壊れます。)

そのため: 宣言はダンプされます。

于 2012-08-31T10:58:09.047 に答える
0

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

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

typedef struct test test_t;

test_t var1, var2;
于 2012-08-31T11:32:18.307 に答える