2012-08-31 12 views
15

Anche se __attribute__ ((aligned)) funziona bene con la dichiarazione typedef come ad esempio:È __attribute__ ((__packed__)) ignorato su una dichiarazione typedef?

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

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

mi sono imbattuto in dichiarazioni che dicono che questo non è il caso di __attribute__ ((__packed__)) con typedef! Stavo esaminando alcune delle domande correlate e alcuni di loro hanno utilizzato l'attributo packed con typedef che corrisponde al nostro codice.

Ora, nel nostro codice definiamo

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

fa la dichiarazione di cui sopra rende il compilatore di silenziosamente scaricare la dichiarazione dell'attributo imballato?

PS: Sì, avrei potuto verificarlo, ma le mie circostanze sono diverse al momento. Diciamo vacanze e uno smartphone!

risposta

1

Si stanno combinando qui due affermazioni.

Inizialmente si definisce una struttura con determinate proprietà. Quindi si crea un alias per questo.

Come si assegna la proprietà packed all'alias, una struttura di dati già creata utilizzata da questo alias non verrà modificata. (Di solito è possibile creare variabili con "struct bla" e "s_bla" [create da "typedef struct bla {} s_bla"] e scambiare questi valori tra di loro.Se sarebbe possibile modificare la struttura usando typedef, questa coerenza si interromperà.)

Quindi: la dichiarazione verrà scaricata.

0

Provare così. Questo potrebbe funzionare.

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

typedef struct test test_t; 

test_t var1, var2; 
9

La dichiarazione mi sembra a posto!

Può essere dichiarato in uno di questi modi.

#include <stdio.h> 

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

int main(void) { 

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

o

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

int main(void) { 

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

garantire che la specifica __attribute__((packed)) parola e attributo segue immediatamente la parentesi destra (}) della dichiarazione di struttura. Se si trova in un'altra posizione (ad esempio, seguendo un'istanza di struttura invece di precedere un'istanza di struttura), il compilatore ignorerà __attribute__((packed)) e emetterà un messaggio di avviso.

Anche se ci dà la dimensione imballata 9, penso che sia meglio evitarlo come dichiarato here e provare il vecchio stile di dichiarazione della struttura scolastica.

+0

wow questo ha funzionato, questo è incredibilmente pericoloso, idk perché è ancora una cosa. – Dmitry

6

La tua dichiarazione sembra essere a posto, ma dipende dal compilatore. Ad esempio, se si desidera rendere il compilatore MinGW rispettoso, è necessario compilare il programma con il parametro -mno-ms-bitfields. Se non si specifica questo flag, non viene emesso alcun avviso, ma l'attributo non è rispettato!

Problemi correlati