Visual Studio中pragma pack指令的范围 < VisualC++中的代码>语法规则包>代码>的范围是什么?API参考 说:

Visual Studio中pragma pack指令的范围 < VisualC++中的代码>语法规则包>代码>的范围是什么?API参考 说:,c++,visual-studio-2013,preprocessor-directive,pragma-pack,C++,Visual Studio 2013,Preprocessor Directive,Pragma Pack,pack在第一次结构、联合或类声明时生效 在布拉格出现之后 因此,对于以下代码: #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

pack在第一次结构、联合或类声明时生效 在布拉格出现之后

因此,对于以下代码:

#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 5

这就是为什么我有点惊讶,我真的很感激你能提供的任何解释。

它在看到pragma后的第一个结构、联合或类声明时生效,并持续到第一次遇到pragma pack(pop)或另一个pragma pack(push),它持续到它的pop对应物

(推送和弹出通常成对出现)

您应该在
第二个示例之前调用
#pragma pack(pop)

#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));
}
#包括
#pragma包(推送,1)
结构第一示例
{
int intVar;//4字节
char charVar;//1字节
};
#布拉格语包(流行语)
结构第二示例
{
int intVar;//4字节
char charVar;//1字节
};
void main()
{
printf(“FirstExample的大小为%d\n”,sizeof(FirstExample));
printf(“第二个示例的大小为%d\n”,sizeof(第二个示例));
}

仅仅因为它“在第一个结构上生效”并不意味着它的效果仅限于第一个结构
#pragma pack
以预处理器指令的典型方式工作:它从激活点开始“无限期”持续,忽略任何语言级别的作用域,即它的效果传播到翻译单元的末尾(或直到被另一个
#pragma pack
覆盖).

两个结构都位于文件中的pragma之后。如果他们不一样,我会感到惊讶。您的输出显示了两行“FirstExample”,因此与您的源代码不匹配…@Jay感谢您的评论。我已经纠正了这个错误。
#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));
}