4

通常我会笑得很开心,但它是如此偷偷摸摸,甚至一点都不有趣。一个结构如何从一个文件到另一个文件有什么不同?

我有一个这样的结构:

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)?

4

1 回答 1

1

这似乎是由一个对齐杂注引起的,当其中一个文件包含标头时,它在范围内,但不是当另一个文件包含标头时。

于 2013-05-15T22:54:55.053 回答