2012-08-31 3 views
15

Obwohl __attribute__ ((aligned)) funktioniert gut mit der typedef Erklärung wie:Wird __attribute__ ((__packed__)) bei einer typedef-Deklaration ignoriert?

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

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

Ich habe über Aussagen kommen, die sagen, dass dies mit __attribute__ ((__packed__)) mit typedef nicht der Fall ist! Ich habe einige der verwandten Fragen durchgegangen und einige von ihnen haben das gepackte Attribut mit typedef verwendet, das mit unserem Code übereinstimmt.

Nun, in unserem Code definieren wir

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

Ist die obige Erklärung der Compiler leise Dump die gepackte Attributdeklaration macht?

PS: Ja, ich hätte es verifizieren können, aber meine Umstände sind im Moment anders. Sagen wir Urlaub und ein Smartphone!

Antwort

1

Sie kombinieren hier zwei Aussagen.

Zunächst definieren Sie eine Struktur mit bestimmten Eigenschaften. Dann erstellen Sie einen Alias ​​dafür.

Wenn Sie die gepackte Eigenschaft dem Alias ​​zuweisen, wird eine bereits erstellte Datenstruktur, die von diesem Alias ​​verwendet wird, nicht geändert. (Normalerweise können Sie Variablen mit "struct bla" und "s_bla" [erstellt von "typedef struct bla {} s_bla"] erstellen und diese Werte untereinander austauschen.Wenn es möglich wäre, die Struktur mit typedef zu ändern, würde diese Kohärenz verwendet wird brechen.)

Also: Die Deklaration wird ausgegeben.

0

Versuchen Sie so. Dies könnte funktionieren.

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

typedef struct test test_t; 

test_t var1, var2; 
9

Die Erklärung scheint mir okay!

Es kann auf eine dieser Arten deklariert werden.

#include <stdio.h> 

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

int main(void) { 

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

oder

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

int main(void) { 

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

Sicherstellen, dass die __attribute__((packed)) Schlüsselwort und Attributspezifikation sofort die richtige Klammer folgt (}) der Strukturdeklaration. Wenn es sich an einer anderen Position befindet (z. B. nach einer Strukturinstanz anstelle einer Strukturinstanz), ignoriert der Compiler __attribute__((packed)) und gibt eine Warnmeldung aus.

Obwohl es uns die gepackte Größe 9 gibt, denke ich, es ist besser zu vermeiden, wie angegeben here und versuchen Sie die alte Schule Struktur Deklaration Stil.

+0

wow das hat funktioniert, das ist unglaublich gefährlich, idk warum es immer noch ein Ding ist. – Dmitry

6

Ihre Deklaration scheint in Ordnung zu sein, aber sie ist vom Compiler abhängig. Wenn Sie beispielsweise den MinGW-Compiler dazu bringen möchten, dies zu tun, müssen Sie Ihr Programm mit -mno-ms-bitfields Parameter kompilieren. Wenn Sie dieses Flag nicht angeben, wird keine Warnung ausgegeben, aber das Attribut wird nicht berücksichtigt!