2014-01-31 3 views
1

header1.hс ++ неправильных значений с прагмой пакетом

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 по-разному. Похоже, что это около #pragma pack(4), которое определено в header1.h. Почему это влияет на header2.h и main.cpp, но не на header2.cpp?

выход

12 4.56 
12 4.56 
16 -9.25596e+061 
+1

Вы уже ответили на свой вопрос - вам нужно применить тот же самый пакет «прагма» ко всем модулям, которые используют одни и те же заголовки, поэтому добавьте '#include 'header1.h" 'в header2.h. –

+1

Почему вы не включаете 'header1.h' в' header2.cpp'? По таким причинам обычно упаковка выполняется непосредственно над самой структурой, а не раздельно. – legends2k

+0

@ легенды2k нет, я не знаю. это совершенно разные автономные проекты. – Ivars

ответ

2

Избавьтесь от header1.h и сделать

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

Без этого, имея упаковка осуществляется через отдельный заголовок приведет к путанице, когда он добавляется в один TU время а не в другом ТУ.

+0

спасибо, что получилось. – Ivars

+1

Добро пожаловать. Подробнее о push и pop см. Здесь [здесь] (http://msdn.microsoft.com/en-us/library/d9x1s805%28v=vs.110%29.aspx). – legends2k

Смежные вопросы