Дополните структуру C ++ степенью двойки - PullRequest
10 голосов
/ 06 августа 2009

Я работаю над кодом C ++ для встроенной системы. Интерфейс ввода / вывода, который использует код, требует, чтобы размер каждого сообщения (в байтах) был степенью двойки. Прямо сейчас, код делает что-то вроде этого (в нескольких местах):

#pragma pack(1)
struct Message
{
   struct internal_
   {
      unsigned long member1;
      unsigned long member2;
      unsigned long member3;
      /* more members */
   } internal;
   char pad[64-sizeof(internal_)];
};
#pragma pack()

Я впервые пытаюсь скомпилировать код на 64-битной Fedora, где long - 64-битная. В этом случае sizeof(internal_) больше 64, выражение размера массива теряет значение, и компилятор жалуется, что массив слишком велик.

В идеале я хотел бы иметь возможность написать макрос, который будет принимать размер структуры и оценивать во время компиляции требуемый размер массива заполнения, чтобы округлить размер структуры до степени два.

Я смотрел на страницу Bit Twiddling Hacks , но я не знаю, может ли какой-либо из методов действительно быть реализован в макросе, который будет оцениваться во время компиляции.

Есть ли другие варианты решения этой проблемы? Или я должен увековечить проблему и просто изменить магические 64 на магические 128?

Ответы [ 11 ]

0 голосов
/ 06 августа 2009
union Message
{
    struct
    {
        unsigned long member1;
        unsigned long member2; //...
    };
    char pad[1 << 5]; //change 5 to whatever size you need...
};

Было бы немного чище.

...