结构偏移不同?

时间:2013-05-15 22:44:40

标签: c++ c linux

通常情况下,我会有一个很好的笑容,但它如此狡猾,甚至不好笑。 一个结构在一个文件到另一个文件之间的区别怎么样?

我有一个像这样的结构:

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

1 个答案:

答案 0 :(得分:1)

当其中一个文件包含标题时,对象编译指示可能是导致,而不是另一个文件时。