Sé que esto la pregunta es vieja ahora, pero creo que hay una solución mejor que las publicadas anteriormente. Es posible poner el pragma en el caso de MSVC en la línea de declaración de estructura después de todo.Considere lo siguiente:
#ifdef _MSC_VER
# define PACKED_STRUCT(name) \
__pragma(pack(push, 1)) struct name __pragma(pack(pop))
#elif defined(__GNUC__)
# define PACKED_STRUCT(name) struct __attribute__((packed)) name
#endif
Entonces esto puede ser usado de esta manera:
typedef PACKED_STRUCT() { short a; int b } my_struct_t;
PACKED_SRUCT(my_other_struct) { short a; int b };
etc.
La clave aquí es que el uso de la __pragma sólo tiene que ser alrededor de la línea de declaración de la estructura Esto necesita incluir el nombre de la estructura si se le da uno, de ahí que el nombre sea un parámetro para la macro. Por supuesto, esto es fácil de extender a enum/class, ¡que dejaré como ejercicio para el lector!
El programa de prueba en el pack documentation MSDN page es útil para verificar esto.
EDITAR
Resulta que en mi prueba de que estaba usando el compilador de Intel en Windows. Usando icl.exe, este enfoque funciona sin problemas, pero con el compilador de Microsoft (cl.exe), no (probado con 2010 y 2013).
@Caspin: Quiero empacar toda la estructura. @Otras: Quiero tener un #define (de hecho 2) para lograr esto para los compiladores que usaré. #pragma truco no funciona en algunos de ellos. – Malkocoglu
Tenga en cuenta que gcc ha admitido '#pragma pack' al menos desde la versión 4.0; no estoy seguro sobre RealView ARM. – Tom