今天在VS2008中发现了超级令人抓狂的问题,经试验发现在VS2010中有同样的问题存在。
重现问题——
在VS2008中新建C++的“win32控制台应用程序”项目,并添加对MFC类库的引用。
在_tmain函数前加上如图所示的注释,然后在主函数中随便写上几句代码,并设置断点,整个代码如图。
最后在debug模式下,按F5运行,结果,程度在第二个断点处没有停住,而是直接运行过去!!
经过反复的试验——包括删除ncb文件,重启VS,重启电脑……忽然想到《Exceptional C++ Style》中有提到注释可能对代码产生影响,比如 “//?” 会被转换成 “\”,结果使第二行代码失效了!!
难道这里也是因为注释的问题?于是将_tmain()前的注释去掉后,果然,断点的功能居然又回来了!!
注释掉的代码也会对程序的调试产生影响!!为了弄明白这个问题,本人接下来查看了其生成的汇编代码——即程序运行到第一个断点处时,调出反汇编窗口,如图
明明是好好的一段注释代码,但微软的VS编译器,硬是在其中加了一堆代码。本人现在才开始学win32下的汇编,只知道ebp,esp是用在函数调用时传递参数用的。
在已经被注释掉的代码却生成了目标代码,虽然没有对程序的结果造成直接影响(该执行的地方都正常运行了,上面的程序可以正常输出1),但不能在调试时查看断点,最令人揪心的是不知这些多余的代码何时会产生更大的影响。并且发现对已经注释掉的结构体里的内容进行修改后(比如添加或减少几个字段的申明),也会影响代码的生成……
当本人花了几个小时找出这个问题后,心情依然沉重,结果是现在不敢在VC++中使用 // 风格的注释了(上面的注释掉成/* */后就没问题),并且尝试了其它可能出现问题的情况。
最后,自己重新建立项目,并且所有的代码都自己敲上去,发现一切OK。原来~~原来,上面那段注释过的代码是同事用QQ发给我的!!!!而QQ对话框中的换行和VS中的转行编码不一样,于是就出现了上面这种注释掉的代码会对程序产生影响的情况~~ QQ~~