Para algunos compiladores, hay un embalaje especificador de estructuras, por ejemplo:
RealView BRAZO compilador tiene "__embalado" Compilador de C de Gnu ha "__attribute__ ((__embalado__))" Visual C++ no tiene equivalente, sólo tiene el "#pragma pack(1)"
Necesito algo que me puede poner en la struct definición.
Cualquier info/hack/sugerencia ? TIA…
- Quiero el pack de toda la estructura. @Los demás: quiero tener un #define (en realidad 2) para realizar esta para compiladores que voy a utilizar. #pragma truco no funciona en algunos de ellos.
- Tenga en cuenta que gcc ha apoyado
#pragma pack
desde al menos la versión 4.0; no está seguro acerca de RealView BRAZO.
No sé una mancha de la manera de hacerlo, pero se podría hacer algo tan terrible como esto:
A continuación, para MSVC, lleno de.h:
endpacked.h
Para gcc, lleno de.h:
endpacked.h:
Fundamentalmente, el embalaje es demasiado dependiente de la plataforma. Supongamos que el empaque de tu estructura es de 8 bits de los campos, y considerar algunos con un sistema de 16 bits byte. No puede tener una estructura que representa los datos sólo por embalaje – tendrías que saber cómo de 8 bits, bytes son convertidos a 16 bits, bytes cuando se transfieren entre los dos sistemas. La estructura en la 16 bits de la máquina puede ser que necesite campos de bits, en cuyo caso tendrías que saber cómo la aplicación dispone.
Así que si el código está destinado a ser generalmente portátil, usted sólo tiene que definir lo que sea lleno de estructuras que usted necesita en una plataforma específica de la sección de encabezado de archivo. O más bien, la estructura de su código para que un futuro puerto puede hacer eso si tiene que ser así.
#ifndef PACKED
/#define PACKED
/#else /* !PACKED */
/#undef PACKED
/#endif /* PACKED */
y, a continuación, incluir una cabecera dos veces, una vez para activar y de una vez para desactivar. La utilidad / limpieza / cordura de tal práctica es discutible, pero así es la práctica que se sugiere.#if _WIN32 #elif __GNUC__
y así sucesivamente alrededor de cada struct definición.#include
es la correcta/única manera en C para abstracto o reutilización de un fragmento de código que contiene las directivas de preprocesador.Puede definir PACK como este para GNU gcc
y como este para Visual C++:
Y utilizarlo como este:
PACK(typedef struct { int x; }) MyStruct;
. También usted puede ser capaz de utilizar#define PACK(...) __VA_ARGS__ __attribute__((__packed__))
etc para manejar comas en la declaración cuerpo.Sé que esta pregunta es viejo ahora, pero creo que hay una mejor solución que los publicados anteriormente. Es posible poner el pragma en el MSVC caso en la declaración struct línea, después de todo. Considere lo siguiente:
Entonces esto puede ser utilizado como:
etc.
La clave aquí es que el uso de la __pragma sólo necesita estar cerca de la línea de declaración de la estructura. Esto debe incluir la estructura struct nombre si se da uno, de ahí el nombre de un parámetro de la macro. Por supuesto, esto es fácil de extender enum/clase, que te dejo como ejercicio para el lector!
El programa de prueba en el paquete de documentación de la página de MSDN es útil para comprobar esto.
EDITAR
Resulta que en mis pruebas de que estaba usando el Compilador de Intel en Windows. El uso de icl.exe este enfoque funciona sin problema, pero con el compilador de Microsoft (cl.exe), no (probado con 2010 y 2013).
error C2143: syntax error : missing ';' before '{'
. Tuve que volver a algo parecido a Steph del post, donde todo el cuerpo de la estructura de la definición es la macro argumento, que tipo de mierda. Sobre todo desde que se confunde vim contexto para colorear en C archivos (vim maneja bien con archivos de C++, aunque; no sé por qué).PACKED_STRUCT
como una palabra clave es genial. Se puede combinar con Steph la solución de este tipo:#ifdef _MSC_VER
# define PACKED_STRUCT( __Declaration__ ) __pragma( pack(push, 1) ) struct __Declaration__ __pragma( pack(pop) )
#elif defined(__GNUC__)
# define PACKED_STRUCT( __Declaration__ ) struct __Declaration__ __attribute__((__packed__))
#endif
Editado: bloques de código no se representan como se esperaba. Lo siento.Que usted puede hacer al revés, ya GCC apoya el VC++ pack relacionados con pragmas. Buscar aquí para obtener más información.
Extraer…
Otra solución, en función de lo que los compiladores necesita apoyo, es un aviso de que GCC ha apoyado el Microsoft-estilo de embalaje pragmas, al menos desde la versión 4.0.4 (la documentación en línea está disponible en gnu.org para las versiones 3.4.6 y 4.0.4 – los pragmas no se describen en el antiguo y en el segundo caso). Esto permite que usted sólo tiene que utilizar
#pragma pack(push,1)
antes de una definición de la estructura y#pragma pack(pop)
después de la definición y se compilará en cualquiera de los dos.#pragma
antes y después de cada declaración.Qué necesitas algo para ir en la estructura?
Creo
#pragma pack(1)
es el mismo, o me estoy perdiendo algo?Usted puede hacer esto:
Pero se ve feo.