So che questo la domanda è vecchia ora, ma credo che ci sia una soluzione migliore di quelle pubblicate in precedenza. Dopo tutto, è possibile inserire il pragma nel caso MSVC nella riga della dichiarazione della struttura.Si consideri il seguente:
#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
allora questo può essere utilizzato in questo modo:
typedef PACKED_STRUCT() { short a; int b } my_struct_t;
PACKED_SRUCT(my_other_struct) { short a; int b };
ecc
La chiave qui è che l'uso del __pragma ha solo bisogno di essere intorno alla linea di dichiarazione della struttura Questo deve includere il nome della struct se ne viene fornito uno, quindi il nome è un parametro della macro. Ovviamente, è facile estendere a enum/class, che lascerò come esercizio al lettore!
Il programma di test su pack documentation MSDN page è utile per verificarlo.
EDIT
Si scopre nella mia prova ho usato il processore Intel Compiler su Windows. Utilizzando icl.exe questo approccio funziona senza problemi, ma con il compilatore Microsoft (cl.exe) non lo fa (testato con il 2010 e il 2013).
fonte
2012-02-29 17:46:06
@Caspin: Voglio imballare l'intera struttura. @Others: Voglio avere un #define (in effetti 2) per ottenere questo risultato per i compilatori che userò. Il trucco #pragma non funziona su alcuni di essi. – Malkocoglu
Nota che gcc ha supportato '#pragma pack' almeno dalla versione 4.0; non sono sicuro di RealView ARM. – Tom