warning C4742: '...'has different alignment in '...' :4 and 1

来源:互联网 发布:淘宝卖家怎么修改主营 编辑:程序博客网 时间:2024/06/06 09:07

warning C4742在网上查到是结构体字节对齐引起的  但是我用的是一个非结构体变量  这个变量在一部分文件里是4字节对齐 一部分文件里是1字节对齐

找的我满头包  但又不能去除#pragma pack(puch, 1)   去除之后会引起其他地方的出错 就如我前几天的文章上写的  必须要字节对齐

 

最后想到了老大之前给我们做培训的时候提到过的/zp

终于不报警告了   虽然知道是什么原因 但是要解决还是费了一番功夫

 

下面是两位苦兄的经过:

http://hi.baidu.com/crazyonline/item/ac00573b7e303c5b80f1a776

 

2009-10-08 10:13

LV1警告C4742 质疑C++一天日记

    经过近一个星期的程序改版,将客户端的资源管理器,精灵管理器,地图管理器,绘制系统,绘制切片修改了一遍,分离了客户端Player和服务器的Player,提取了一个基类NPC,然后分离了逻辑系统和绘制系统,完成了客户端Object,NPC,Item的排序绘制问题。昨天终于写完,编译程序,我期望着一次性编译通过,但是我又知道这是不可能的,任何再强的高手都不可能达到写个几万行的代码一次性编译通过。不过因为我是改版,错误也比较少,都是一些因头文件没包含导致符号未定义的问题。不过服务器还好,开启数据库后,直接运行成功了。但是噩梦将从那时开始,事情发生在昨天早上····

    当我启动客户端,按起F5的时候,嘣的一声,程序崩溃了。意料之中的意外事情。简单的call stack,很快发现问题,原来是因为日志系统的一个mutex访问出错,奇了怪了,是记文件日志系统的一个互斥体访问出错,这个日志系统用了半年多快1年了,linux,window,unix也好,多线程中也用过,都没跑出过问题,怎么会出问题呢?最后发现,原来是因为我在全局变量的构造函数中初始化该类的配置文件,而该配置文件又读取失败,我就记日志,而日志系统中的静态变量mutex是保护文件读取的,但是这个静态变量又没有被初始化,因为此时正在初始化当前这个类的全局对象,所以0x000005了。简单修改,解决了问题。这下让人疯狂的事情终于发生了,重启F5,嘣,继续崩溃。

    继续我的调试之旅,问题很快找到,但是这个问题让陷入了对C++的质疑,对编译器的质疑,对操作系统的质疑。原来是因为对象Player的动画指针m_pXAnimation访问非法,是因为没有初始化。找到构造函数,该指针初始化=NULL,明明写在上面的啊,why?初始化不管作用了?我用0代替NULL,重新定义NULL都不管用,继续调试在代码中发现如此问题:

if (m_pXAnimation != NULL)

{

       assert(m_pXAnimation != NULL);

}

else{}

大概代码逻辑如上,在内存中能够看见m_pXAnimation 明明是0x000000,但是仍然进入了if的条件中,并且assert的时候也能看见是0x000000,但是assert置若罔闻,继续执行,更本没去else中,苍天+大地啊,我调用了m_pXAnimation的一个函数,在函数体中发现this奇怪滴变成了0x512ff8800,怪事了,在外层看见是0x000000,计入函数体变成了另外一个值。经过不停滴调试,更神奇的事情发生了,在Player的构造函数中,m_pXAnimation没有初始化的时候为0xabababab值,然后让m_pXAnimation=NULL之后,m_pXAnimation的值仍然显示为0xabababab值,赋值操作没有了作用,神了,神了。我几乎崩溃了,我开始怀疑操作系统,但是系统是好的啊,一直都这么用,也没中过毒,通常就用来办公,应该不会。那难道说是编译器出问题了,如果编译器出问题,为啥服务器编译运行好好的呢?也不应该啊,难道是因为我没有打什么补丁,网上找找也没啥补丁不补丁的啊。难道是C++问题,更不可能了,用了那么多年的C++,如果这个都出问题,早就世界大乱了,一阵胡思乱想,就这样白天一天过去了,中间还发现一个更神奇的问题。有这么一行代码:

CPlayer * p = gPlayerList[0];

然后在查看内存时我无意发现了p的指针是指向0x60d0c768,但是我查看&gPlayerList[0]地址的时候发现指针指向0x60d0c765,居然少指了3位呢,苍天,太苍天了吧,真的让我崩溃。

   我在呼吸乱想地怀疑着,因为全局静态数据的原因?全局变量没初始化,好,我换成堆区,在堆区分配内存问题依旧,是因为栈崩溃了?不应该

   在绝望中我编译了release版,在绝望中我看见了一个警告C4742,在绝望中我觉得这个警告很重要,在绝望中我查看了msdn,在绝望中微软说了可能是因为结构对齐内存分配问题,在绝望中我看到了希望,微软这么说:'var' has different alignment in 'file1' and 'file2': number and number,This can be caused by using incompatible types when declaring variable in different files, or by using non-matching #pragma pack in different files.To resolve this warning, either use the same type definition or use different names for the variables.对症下药,原来是因为我使用了pack,最后战斗的激情燃烧了,剥开云雾见青天了。我为啥使用pack呢?还不是因为该死的地图编辑器,读取地图数据兼容。

实践告诉我,不要质疑事实与真理,如果你没干出来,只能说明一个问题,你自身肯定存在着某个问题。

 

http://bbs.csdn.net/topics/360200456

 

自己去看吧

 

 

原创粉丝点击