2012-01-02 15 views
6

Per vari motivi, ho alcune strutture che voglio forzare per essere dimensioni specifiche (in questo caso 64 byte e 512 byte). Entrambi, tuttavia, sono al di sotto del poco al di sotto delle dimensioni che voglio che siano.Forza dimensione specifica della montatura in C

C'è comunque da dire al compilatore di impostarli su queste dimensioni specifiche e sul pad con zeri, oppure sarei meglio se dichiarassi un array all'interno della struttura che costituisce lo spazio in eccesso in modo che si allinea sul taglia che voglio?

+5

Quali sono i motivi? Potrebbe esserci un altro modo per risolvere il problema. –

+0

mi viene in mente unioni con una serie di caratteri ... – amit

+0

Si potrebbe provare una sorta di hack con '#pragma pack', ma non so quanto sarà utile. – Polynomial

risposta

17

È possibile utilizzare un sindacato.

struct mystruct_s { 
    ... /* who knows how long */ 
}; 

typedef union { 
    struct mystruct_s s; 
    unsigned char padding[512]; 
} mystruct; 

Ciò garantisce che l'unione sia 512 byte o più. Quindi, è possibile garantire che si tratta di non più di 512 byte utilizzando un'affermazione statica da qualche parte nel codice:

/* Causes a compiler error if sizeof(mystruct) != 512 */ 
char array[sizeof(mystruct) != 512 ? -1 : 1]; 

Se si utilizza C11, c'è un modo migliore per farlo. Non conosco nessuno che usi C11 ancora. Lo standard è stato pubblicato poche settimane fa.

_Static_assert(sizeof(mystruct) == 512, "mystruct must be 512 bytes"); 

noti che l'unico modo per riempire con zeri è mettere lì manualmente (o callocmemset) zeri. Il compilatore ignora i byte di riempimento.

+0

Mi piace, grazie! – themaestro

0

Non penso che ci sia un modo per automatizzare questo, almeno in gcc che è il compilatore che uso. Devi tamponare le tue strutture.

Fare attenzione a automatic alignment di variabili nella struttura. Ad esempio esempio di struttura { char a; int b; }

non prende 5 byte, ma 8.