上次发现过的vs2012链接错误又出现了几次,这下可以分析原因了。
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(347,5): error MSB6006: "CL.exe" exited with code 1.
这几次出现的错误都和“基于范围的循环”有关,但是表现略有不同。
首先,所有的错误都出现在这样一句里面:
for(auto item:myList)
...
其中,myList按照vs2012的要求,必须要有begin和end方法。这种循环是遍历vector/map最省事的方法。如果myList没有这两个方法,那就一定会出现链接错误。
- 如果是出现在一个普通的函数里面,vs2012会显示一条红色的波浪线,表示有错误。把鼠标放在上面也会提示错误信息。但是即使是这种情况,vs2012的编译过程也不会报错,而是在链接的时候挂掉。这确实有点奇怪,编译程序怎么还不如编辑界面的检查呢?
- 如果是出现在一个模板函数或者模板类里面,那这条波浪线也不会出现,所以出了问题就更难查
- 即使没有任何错误,但是for循环里面一无所有,cl.exe也仍然会挂掉。这是最奇怪的现象。昨天为了调试,顺手注释掉了循环中的所有内容,结果害得我伤透了脑筋。
我的猜测是,vs2012大概把这种循环当作了某种模板来展开实现的,但是在展开之后编译器的检查又不够完善,因此导致了这类问题。
希望vs的下一个补丁能把这个问题修掉吧。