Я работаю над кодом 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?