#c #bmp #file-format
#c #visual-studio #visual-studio-2010
Вопрос:
Я пишу синтаксический анализатор для некоторой структуры данных, после нескольких часов отладки я обнаружил, что проблема в том, что Visual Studio не интерпретирует структуры так, как я говорю. Кажется, используется какое-то «заполнение»
struct foo {
unsigned char a; //0x00
unsigned char b; //0x01
unsigned int c; //0x02
unsigned int d; //0x06
unsigned int e; //0x0A
unsigned int f; //0x0E
//0x12
};
Я ожидал «sizeof(foo)=4*4 2=18» но я получаю «sizeof (foo) =20». Есть ли возможность отключить заполнение только для этой специальной структуры? Я пытался
__declspec(align(1)) struct foo { ...
но это не работает. Спасибо за вашу помощь.
Комментарии:
1. Я думаю, что эта статья о MSDN поможет .
2. Вы компилируете с
/Zp 1
?3. @MartinBroadhurst Это привело бы к глобальному отключению заполнения, решение Ганса работает.
Ответ №1:
Используйте #pragma pack
директиву для этого:
#pragma pack(push, 1)
struct foo {
// etc..
};
#pragma pack(pop)
Ответ №2:
Visual Studio 2010 должен #pragma pack
делать то, что вы ищете.
Комментарии:
1. Но разве это не повлияет на все структуры? Я просто хочу, чтобы это было локально для этой одной структуры.
2. Вы можете отменить его впоследствии — вы даже читали эту документацию?
3. Вы можете использовать #pragma pack push / pop, чтобы обойти это. Просто нажмите до и нажмите после структуры.