那么header1.h
#pragma pack(4)
header2.h
#include <iostream>
struct my_struct
{
unsigned int a;
double b;
};
__forceinline void show_h(my_struct* my_struct_ptr)
{
std::cout << sizeof(my_struct) << '\t' << my_struct_ptr->b << '\n';
}
void show_cpp(my_struct*);
header2.cpp
#include "header2.h"
void show_cpp(my_struct* my_struct_ptr)
{
std::cout << sizeof(my_struct) << '\t' << my_struct_ptr->b << '\n';
}
的main.cpp
#include "header1.h"
#include "header2.h"
#include <iostream>
int main()
{
my_struct my_struct;
my_struct.b = 4.56;
std::cout << sizeof(my_struct) << '\t' << my_struct.b << '\n';
show_h(&my_struct);
show_cpp(&my_struct);
return 0;
}
main.cpp,header2.h和header2.cpp以不同的方式看待my_struct
。看起来好像是在header1.h中定义的#pragma pack(4)
。为什么它影响header2.h和main.cpp但不影响header2.cpp?
输出
12 4.56
12 4.56
16 -9.25596e+061
答案 0 :(得分:2)
摆脱header1.h
并执行
#pragma pack(push, 4)
struct my_struct
{
unsigned int a;
double b;
};
#pragma pack(pop)
如果没有这个,通过单独的标题完成打包将导致混淆,当它被添加到一个TU而不是在另一个TU中时。