Xiangism

从一个无知角落里开始,蹒跚学步,一个未知到另一个未知,在跌跌撞撞中越走越快,越走越远,最后宇宙也为之开源。对于探索者来说,最后他们的思想总是变得和自己的足迹一样伟大。
  博客园  :: 首页  :: 联系 :: 管理

当Visual Studio中的注释也会生产代码时……

Posted on 2012-10-26 13:07  Xiangism  阅读(4348)  评论(16编辑  收藏  举报

今天在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~~