2012-08-31 30 views
15

Aunque __attribute__ ((aligned)) funciona bien con la declaración typedef tales como:¿Se ha ignorado __attribute__ ((__packed__)) en una declaración typedef?

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

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

que han llegado a través de las declaraciones que dicen que esto no es el caso de __attribute__ ((__packed__)) con typedef! Estaba repasando algunas de las preguntas relacionadas y algunas de ellas han usado el atributo empaquetado con typedef, que coincide con nuestro código.

Ahora, en nuestro código definimos

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

lo hace la declaración anterior hace que el compilador silencio volcar la declaración de atributo lleno?

PD: Sí, podría haberlo verificado, pero mis circunstancias son diferentes en este momento. ¡Digo vacaciones y un teléfono inteligente!

Respuesta

1

Usted está combinando dos declaraciones aquí.

Al principio define una estructura con ciertas propiedades. Luego creas un alias para él.

Al asignar la propiedad empaquetada al alias, no se modificará una estructura de datos ya creada utilizada por este alias. (Por lo general, puede crear variables con "struct bla" y "s_bla" [creado por "typedef struct bla {} s_bla"] e intercambiar estos valores entre sí. Si fuera posible alterar la estructura con typedef, esta coherencia se romperá.)

Entonces: La declaración será objeto de dumping.

0

Pruebe así. Esto podría funcionar.

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

typedef struct test test_t; 

test_t var1, var2; 
9

La declaración ¡Me parece bien!

Se puede declarar de una de estas formas.

#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)); 
} 

Asegúrese de que la especificación __attribute__((packed)) palabra clave y el atributo sigue inmediatamente a la llave derecha (}) de la declaración de la estructura. Si está en cualquier otra posición (por ejemplo, siguiendo una instancia de estructura en lugar de preceder a una instancia de estructura), el compilador ignorará __attribute__((packed)) y emitirá un mensaje de advertencia.

Aunque nos da el tamaño 9 lleno, creo que es mejor evitarlo como se indica here y probar el estilo de declaración de la estructura de la vieja escuela.

+0

wow esto funcionó, eso es increíblemente peligroso, no sé por qué todavía es una cosa. – Dmitry

6

Su declaración parece estar bien, pero depende del compilador. Por ejemplo, si desea que el compilador MinGW lo respete, debe compilar su programa con el parámetro -mno-ms-bitfields. Si no especifica este indicador, no se emite ninguna advertencia, ¡pero el atributo no se respeta!

Cuestiones relacionadas