使用pragma pack c ++错误的值

时间:2014-01-31 07:39:57

标签: c++ struct pragma memory-alignment pack

那么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

1 个答案:

答案 0 :(得分:2)

摆脱header1.h并执行

#pragma pack(push, 4)
struct my_struct
{
  unsigned int a;
  double b;
};
#pragma pack(pop)

如果没有这个,通过单独的标题完成打包将导致混淆,当它被添加到一个TU而不是在另一个TU中时。