c++visual-studio-2013preprocessor-directivepragma-pack

Scope of the pragma pack directive in Visual Studio


What is the scope of the #pragma pack alignment in Visual C++? The API reference https://msdn.microsoft.com/en-us/library/vstudio/2e70t5y1%28v=vs.120%29.aspx says:

pack takes effect at the first struct, union, or class declaration after the pragma is seen

So as a consequence for the following code:

#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));
}

I've expected:

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

but I've received:

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

That is why I am a little surprised and I really appreciate any explanation you can provide.


Solution

  • Just because it "takes effect at the first struct" does not mean that its effect is limited to that first struct. #pragma pack works in a typical way for a preprocessor directive: it lasts "indefinitely" from the point of activation, ignoring any language-level scopes, i.e. its effect spreads to the end of translation unit (or until overridden by another #pragma pack).