2014-01-31 50 views
1

那么header1.hC++编译指示与包

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'; 
} 

米错误的值ain.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

您已经回答了您自己的问题 - 您需要对共享相同标题的所有模块应用相同的'pragma pack',因此请将'#include“header1.h”'添加到header2.h。 –

+1

为什么你不在'header2.cpp'中包含'header1.h'?正是出于这样的原因,通常封装只是在结构本身的上方完成,而不是将其分开。 – legends2k

+0

@ legends2k不,我不知道。这些完全不同的独立项目。 – Ivars

回答

2

摆脱header1.h

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

没有这一点,具有通过单独的头做包装会导致混乱,当它在一个TU而真实添加不在另一个TU。

+0

感谢它解决了。 – Ivars

+1

欢迎。有关push和pop的详细信息,请参见[here](http://msdn.microsoft.com/zh-cn/library/d9x1s805%28v=vs.110%29.aspx)。 – legends2k