2012-01-02 2 views
6

По разным причинам у меня есть несколько структур, которые я хочу установить для конкретных размеров (в данном случае 64 байта и 512 байтов). И тем не менее, они ниже, чем размеры, которые я хочу, чтобы они были.Специфичный размер конструкции в C

Есть ли в любом случае мне сказать компилятору, чтобы установить их на эти конкретные размеры и заполнить нулями, или мне лучше всего просто объявить массив внутри структуры, который составляет избыточное пространство, чтобы он выравнивался по размер я хочу?

+5

В чем причина? Возможно, есть еще один способ решить проблему. –

+0

Использование союзов с массивом символов приходит на ум ... – amit

+0

Вы можете попробовать какой-то взлом с '#pragma pack', но я не знаю, насколько это будет полезно. – Polynomial

ответ

17

Вы можете использовать союз.

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

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

Это гарантирует, что соединение составляет 512 байт или более. Затем, вы можете убедиться в том, что это не более 512 байт, используя статическую утверждение где-то в коде:

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

Если вы используете C11, есть лучший способ сделать это. Я еще не знаю кого-нибудь, кто использует C11. Стандарт был опубликован несколько недель назад.

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

Обратите внимание, что единственный способ прокладки с нулями это поставить нули там вручную (calloc или memset). Компилятор игнорирует байты заполнения.

+0

Мне это нравится, спасибо! – themaestro

0

Я не думаю, что есть какой-либо способ автоматизировать это, по крайней мере, в gcc, который является компилятором, который я использую. Вы должны заполнить свои структуры.

Будьте внимательны относительно automatic alignment переменных в вашей структуре. Например, struct example { char a; int b; }

не занимает 5 байт, но 8.

Смежные вопросы