vc6 和vs2010相比,C++标准已经发生了较大的变化,而且VC6编译器可能有不少不严谨的地方,在搬移过程中应当注意:
1。 for循环语句内部定义的循环变量。VC6定义在语句外部,vs2010在语句内部。
2。 #pragma pop(n) 对vc6实际不起作用,但是vs2010时起作用的。这样会改变以后代码数据的对齐。
3。vs2010不允许char->int->float->double的默认向上转换。所有类型不匹配的地方都会无法编译通过。这个改变在我看来非常没有道理,据说在更新的版本中,有已经改回来了。
4。stl 大幅修改。一个比较明显的变化: VC6传递stl对象实际上采用的是shallow copy, 也就是对象内部指针指向的内容并没有被拷贝。但在vs2010下面,对象传递为deep copy. 比如std::string的传递,如果要改变指针指向的内容,如果采用的值传递,将无法得到效果。这方面解决的办法最好是严格遵循C++规范,如果要改变被传递的对象,最好使用引用或者指针,如果没有被改变,最好采用const reference. 否则deep copy 的效率也是个严重的问题。
5。MFC消息回调函数返回值改为LRESULT
6。更严格的堆栈检查。函数内部local变量越界在VC6经常无法发现,但在vs2010中必定出错。
7。 对一些字符串函数,vs2010都建议使用对应的安全字符串函数。大多数情况下用户可以忽略这一警告。
总的来说这个搬移主要问题出现在:
其一:语法规则的改变导致的编译错误。
其二:由于stl以及一些库的改变导致的行为改变,从而使程序运行不正常,这类问题一般需要更多的时间和精力。
其三:vs2010更严格的标准可能导致原来可能工作的代码不再正确。这是好事,可以找出一些原来代码的隐患。