Локально отключить заполнение

#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, чтобы обойти это. Просто нажмите до и нажмите после структуры.