加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 结构偏移不同?

发布时间:2020-12-16 07:04:25 所属栏目:百科 来源:网络整理
导读:通常我会有一个很好的笑容,但它如此鬼鬼祟祟,甚至不好笑. 一个结构在一个文件到另一个文件之间的区别怎么样? 我有一个像这样的结构: typedef struct pp_sig_s{ [...] int flags; size_t max; bool is_reversed; unsigned int sig[64]; size_t byref; [...]
通常我会有一个很好的笑容,但它如此鬼鬼祟祟,甚至不好笑.
一个结构在一个文件到另一个文件之间的区别怎么样?

我有一个像这样的结构:

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

另一个名为pp_sig_t的对象g_sig_1在“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上使用Intel C XE Composer 2013 Update 2)吗?

解决方法

似乎这可能是由于其中一个文件包含标题时范围内的对齐编译指示引起的,但是当另一个文件包含标题时则不然.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读