通常我会笑得很开心,但它是如此偷偷摸摸,甚至一点都不有趣。一个结构如何从一个文件到另一个文件有什么不同?
我有一个这样的结构:
typedef struct pp_sig_s
{
[...]
int flags;
size_t max;
bool is_reversed;
unsigned int sig[64];
size_t byref;
[...]
}
pp_sig_t;
它是在say“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中的不同......
一个结构如何从一个文件到另一个文件?我们如何在不使用 pragma 的情况下避免这种情况?是否可以称为编译器错误(我在 linux 上使用 Intel C++ XE Composer 2013 Update 2)?