Есть ли способ клонировать существующую структуру с другим выравниванием элементов в Visual C ++?
Вот фон:
Я использую стороннюю библиотеку, которая определяет несколько структур. Чтобы заполнить структуры, я передаю адрес экземпляров структуры некоторым функциям. К сожалению, функции возвращают только невыровненный буфер, так что данные некоторых членов всегда неверны.
/ Zp не может быть выбран, так как он нарушает другие части программы. Я знаю, #pragma pack
изменяет выравнивание следующей определенной структуры, но я бы предпочел не копировать структуры в мой код, поскольку определения в библиотеке могут измениться в будущем.
Пример кода:
library.h:
struct am_aligned
{
BYTE data1[10];
ULONG data2;
};
struct untouched
{
BYTE data1[9];
int data2;
};
test.cpp:
#include "library.h"
// typedef alignment(1) struct am_aligned am_unaligned;
int APIENTRY wWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
char buffer[20] = {};
for (int i = 0; i < sizeof(am_unaligned); i++)
{
buffer[i] = i;
}
am_aligned instance = *(am_aligned*) buffer;
untouched useless;
return 0;
}
am_unaligned
- это мое пользовательское объявление, и оно действует только в test.cpp
. Закомментированная строка не работает, конечно. нетронутый должен по-прежнему иметь выравнивание по умолчанию.
instance.data2
равен 0x0f0e0d0c
, в то время как 0x0d0c0b0a
является желательным.
Спасибо за помощь!