一个关于TCHAR的离奇bug
2009-04-13 21:23
381 查看
最近解了一个超级让人faint的bug。 一个成员函数f()明明修改了一个成员变量a,可是执行完一看,压根就没改。debug的时候也看不出啥问题,进这个函数f的时候是看着改了,一离开这个函数,a的值还是修改前的值。
我又研究了十几分钟,终于看出了原因。该成员函数是父类B的,子类C继承了B。B类的定义里,简化一下,就是这样的:
class B
{
TCHAR str[MAXLEN];
int a;
int f(int n){a = n;}
};
结果,B在编译的时候没有定义unicode宏,而C类编译的时候定义了unicode。于是TCHAR在这两类中分别被替换成了char 和 wchar_t, 导致a的偏移值不同。而f又恰恰是个内联的函数,子类父类各自有自己的一段f函数的代码。于是,子类的代码里f修改的a在父类看来根本不知道是啥地方了,而父类的a那个位置的变量根本没变。
由此可见,使用TCHAR是要多么的小心啊,宏实在够危险。
还有,父类和子类编译的参数也要小心设置才行。
我又研究了十几分钟,终于看出了原因。该成员函数是父类B的,子类C继承了B。B类的定义里,简化一下,就是这样的:
class B
{
TCHAR str[MAXLEN];
int a;
int f(int n){a = n;}
};
结果,B在编译的时候没有定义unicode宏,而C类编译的时候定义了unicode。于是TCHAR在这两类中分别被替换成了char 和 wchar_t, 导致a的偏移值不同。而f又恰恰是个内联的函数,子类父类各自有自己的一段f函数的代码。于是,子类的代码里f修改的a在父类看来根本不知道是啥地方了,而父类的a那个位置的变量根本没变。
由此可见,使用TCHAR是要多么的小心啊,宏实在够危险。
还有,父类和子类编译的参数也要小心设置才行。
相关文章推荐
- 关于CUDA4.1 NVCC一个奇妙的BUG 的解释
- 关于javascript event flow 的一个bug详解
- 一个关于C#语言中的Property的低级BUG,花了我二十分钟
- 关于网络请求的一个异常bug(java.lang.IllegalArgumentException: Host name may not be null)
- Myeclipse10.0关于javascript的一个错误提示的Bug:Cannot return from outside a function or method
- 网上看到的关于bug度量的一个公式
- struts2关于checkbox处理的一个bug
- 一个关于Java的装箱与拆箱的bug
- Android6.0里面webview关于onReceivedTitle的一个系统bug
- WPF关于WindowInteropHelper的一个BUG
- 关于在画图程序中做图形拖动模块的一个bug
- CSS IE6、7下关于Position的一个bug问题分享
- actionscript3的一个bug 关于super
- 最近写出一个bug,关于模块在注册时返回-1
- 一个小bug,关于fuse_mount_sys
- [前端测试]关于JS判断id的一个Bug
- 关于axis2中对soapfault的处理的一个小bug
- WPF关于WindowInteropHelper的一个BUG
- 【找bug有奖励】:关于加密算法的一个bug,知道答案评论对了支付宝奖励5块
- Android开发:canvas.drawTextOnPath()无效----Android4.03的又一个bug!!!!(关于Canvas绘制的方方面面)