2014-01-31 54 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