曾经在Win7下,使用VS2003与VS2008遇到过几个问题,现记录如下,免得以后再次遇到又费一番周折。

1、问题:    用VS2003创建程序后,程序编译时,提示fatal error C1033:无法打开程序数据库

  解决办法:在VS2003图标上点击右键,选择属性,在兼容性属性页中,去掉“兼容性模式运行程序”选项即可。


2、问题:    用VS2003创建程序后,使用“在文件中查找”时,VS2003僵死

  解决办法:在VS2003图标上点击右键,选择属性,在兼容性属性页中,勾选“禁用视觉主题”选项即可。


3、问题:    VS2003MFC程序,属性面板空白,想设置资源属性或添加消息响应、虚函数等均不可。

  解决方法:使用C#创建一个工程,打开其属性面板,可见有内容,编译运行,关闭,打开MFC程序,即可。


4、问题:    VS2008在编译时,提示“Microsoft@ Incremental Linker已停止工作”

  解决方法:这个是因为工程设置有问题:

  (1).右键项目->属性->配置属性->链接器->常规->启用增量链接,将“是(/INCREMENTAL)”改为“否(/INCREMENTAL:NO)”;

  (2).右键项目->属性->配置属性->C/C++->调试信息格式,将“用于‘编辑并继续’的程序数据库(/ZI)”改为“程序数据库(/Zi)”即可。



另外,VC6.0和VS2008有如下区别:

1、消息映射

VS2008对消息映射的检查更为严格,以前在VC6下完全正常运行的消息映射在VS2008下编译不通过。如

ON_MESSAGE(message, OnMessage);

在VS2008下,OnMesssage返回值必须为LRESULT,其形式为:afx_msg LRESULT OnMessage(WPARAM,  LPARAM);


2、字符处理

在c中广泛使用的strcpy, strcat, stsstr等等,在VS2008下,推荐使用更为安全的strcpy_s, strcat_s, strstr_s等来代替。


3、数学函数检查

VS2008中,数学函数的参数检查更为严格,如sin(5)会引起一个错误提示

error C2668: “sin”: 对重载函数的调用不明确,可能是“long double sin(long double)”或“float sin(float)”或“double sin(double)”


4、for循环变量作用域

在VC6中,for循环中循环变量的作用域延伸到循环体外,在VS2008中,则限制在循环内部。

for (int i=0; i<100; i++);    // 在循环外部使用i,在VC6可以,在VS2008中则提示找不到i的定义。