2012-12-03 5 views
12

Es ist möglich, GCC mitzuteilen, dass es kein Padding für die Struktur verwenden soll. Dies geschieht mit __attribute__((packed)).Wie deklariert gepackte Struktur (ohne Auffüllung) für LLVM?

typedef struct { 

    uint8_t startSymbol; 
    uint8_t packetType; 
    uint32_t deviceId; 
    uint16_t packetCRC; 

} PacketData __attribute__((packed)); 

Der neueste Xcode verwendet jedoch LLVM und erkennt das Attribut nicht. Wie definiert man gepackte Struktur für LLVM?

Die vollständige Beschreibung des Problems könnte here

UPDATE Ich verwende Xcode 4.5.1 für iOS, die Apple verwendet LLVM 4.1 Compiler gefunden werden. Ich erhalte in Xcode im obigen Codebeispiel die Warnung "gepackte Attribute ignorieren".

+0

Fehle ich etwas oder dies ist eine sehr neue Feature-Entfernung? Das letzte Mal, als ich überprüft habe, unterstützt clang '__attribute __ ((gepackt))' ... –

+0

clang unterstützt genau das gleiche '__attribut __ ((gepackt))' pragma ... – birryree

+0

Keine Ahnung :) Ich benutze Xcode 4.5. 1 für iOS, die Apple LLVM 4.1 Compiler verwendet. – Centurion

Antwort

21

Haben Sie es tatsächlich versucht? Ich habe es gerade auf meiner Maschine getestet, und __attribute__((packed)) kompiliert mit clang.

Edit: Ich habe die gleiche Warnung ("Warnung: gepacktes Attribut ungenutzt") für

typedef struct { 
    int a; 
    char c; 
} mystruct __attribute__((packed)); 

und in diesem Fall sizeof(mystruct) war 8.

jedoch

typedef struct __attribute__((packed)) { 
    int a; 
    char c; 
} mystruct; 

hat gut funktioniert, und sizeof(mystruct) war 5.

Fazit: Es scheint, dass das Attribut der Strukturbezeichnung vorausgehen muss, damit dies funktioniert.

+0

Ja, ich habe es gerade jetzt gemacht. Ich verwende Xcode 4.5.1 für iOS, das Apple LLVM 4.1 Compiler verwendet. Ich bekomme eine '' gepackte '' Attribut ignoriert 'Warnung in Xcode – Centurion

+0

@Centurion Dann überprüfe 'sizeof (PacketData)', um zu sehen, ob die Warnung irrelevant ist. Clang auf Linux behandelt das Pragma gut. – chrisaycock

+0

@Centurion Bedeutet es nicht, dass es erkannt/unterstützt nur nicht verwendet wird? Implementieren Sie die Struktur tatsächlich irgendwo im Code? –

5

Sie Präprozessordirektive verwenden können Byte-Ausrichtung für die Struktur zu bestimmen, so wird keine Polsterung vom Compiler erfolgen:

#pragma pack(1)

typedef struct{
char t1;
long long t2;
char t3;
}struct_size_test;

#pragma options align=reset

Siehe die Antwort auf this Frage zu Stackoverflow.

0

Klirren 3.5 auf Linux -

typedef struct __attribute__((packed)) thing1 { int blah; } THING_ONE;

gearbeitet.

+0

Es gab bereits eine Antwort, die genau das angibt, warum ein weiteres hinzufügen? – Johan