通常情况下,我会有一个很好的笑容,但它如此狡猾,甚至不好笑。 一个结构在一个文件到另一个文件之间的区别怎么样?
我有一个像这样的结构:
typedef struct pp_sig_s
{
[...]
int flags;
size_t max;
bool is_reversed;
unsigned int sig[64];
size_t byref;
[...]
}
pp_sig_t;
在“header01.h”中定义 我使用的一些功能是在“program01.cpp”中 以这种方式宣布
void PrintSig(pp_sig_t *s); // prints the content of sig[64] array in pp_sig_t for test purposes
另一个名为g_sig_1的对象pp_sig_t在“header02.cpp”中定义... 这个.cpp当然包括header01.h 我在里面用这种方式调用打印例程
PrintSig(&g_sig_1);
我注意到打印结果与实际内容不同。 假设sig包含0xE8,然后打印0xE800
然后,我想,大约2个小时的调查,它可能是结构对齐。
我试试......
在header01.h中以这种方式声明结构
#pragma push()
#pragma pack(4)
typedef struct pp_sig_s
{
[...]
int flags;
size_t max;
bool is_reversed;
unsigned int sig[64];
size_t byref;
[...]
}
pp_sig_t;
#pragma pop()
突然间一切正常......
所以基本上就像在program01.cpp中一样,结果偏移是,我猜,与program02.cpp不同......
结构在一个文件与另一个文件之间的区别怎么样?如何在不使用编译指示的情况下避免这种情况?它可以被称为编译器错误(我在Linux上使用英特尔C ++ XE Composer 2013 Update 2)?
答案 0 :(得分:1)
当其中一个文件包含标题时,对象编译指示可能是导致,而不是另一个文件时。