Область применения директивы пакета прагмы в Visual Studio

Какова сфера действия #pragma pack выравнивание в Visual C++? Ссылка на API https://msdn.microsoft.com/en-us/library/vstudio/2e70t5y1%28v=vs.120%29.aspx гласит:

Пакет вступает в силу при первом объявлении struct, union или class после того, как прагма видна

Как следствие для следующего кода:

#include <iostream>

#pragma pack(push, 1)

struct FirstExample
{
   int intVar;   // 4 bytes
   char charVar; // 1 byte
};

struct SecondExample
{
   int intVar;   // 4 bytes
   char charVar; // 1 byte
};


void main()
{
   printf("Size of the FirstExample is %d\n", sizeof(FirstExample));
   printf("Size of the SecondExample is %d\n", sizeof(SecondExample));
}

Я ожидал:

Size of the FirstExample is 5
Size of the SecondExample is 8

но я получил:

Size of the FirstExample is 5
Size of the SecondExample is 5

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

3 ответа

Решение

То, что он "вступает в силу в первой структуре", не означает, что его действие ограничено этой первой структурой. #pragma pack работает типично для директивы препроцессора: она длится "бесконечно" с момента активации, игнорируя любые области уровня языка, то есть ее эффект распространяется до конца единицы перевода (или до тех пор, пока не будет переопределен другой #pragma pack).

Он вступает в силу при первом объявлении struct, union или class после просмотра прагмы и действует до первого обнаруженного пакета #pragma (pop) или другого пакета #pragma (push), который продолжается до его аналога pop.

(толчки и хлопки обычно идут парами)

Вам следует позвонить #pragma pack(pop) до SecondExample

#include <iostream>
#pragma pack(push, 1)

struct FirstExample
{
   int intVar;   // 4 bytes
   char charVar; // 1 byte
};

#pragma pack(pop)

struct SecondExample
{
   int intVar;   // 4 bytes
   char charVar; // 1 byte
};


void main()
{
 printf("Size of the FirstExample is %d\n", sizeof(FirstExample));
 printf("Size of the SecondExample is %d\n", sizeof(SecondExample));
}
Другие вопросы по тегам