VC6.0工程转换到VS2010版本的常见问题

来源:互联网 发布:jdk 7u79 windows x64 编辑:程序博客网 时间:2024/05/29 15:08

由于不少程序的Demo是用VC6.0编写的,在没安装VC6.0得情况下,常常将其转化为高版本的vs工程,但转化编译后会存在各种问题,以下就是版本转换常见的问题。

1、math.h中的函数报错

 如果你在vc6.0的过程中使用到math.h库函数中的pow函数、sqrt函数等,在转换后可能会出现以下错误:

error C2668: “pow”: 对重载函数的调用不明确

error C2668: “sqrt”: 对重载函数的调用不明确

出现这个问题,常常是因为使用这两个函数时,第一个参数使用的int的数据类型。

我们在VS2010中打开的math.h头文件,搜索pow函数的定义,发现根本没有第一个参数为int数据类型的重载函数。


所以我们只要对使用的参数进行强制转换即可,或者重新定义该参数的数据类型,让其匹配重载函数的一个。

2、不能实例化抽象类的错误

如果你的代码涉及到C++的异常抛出,编译转换后的代码还可能会出现以下错误:

error C2259: “CException”: 不能实例化抽象类

这是由于CException在两个版本的AFX.h中的定义是不同的。

c:\Program Files (x86)\Microsoft Visual Studio\VC98\MFC\Include\AFX.H中:

#ifdef _AFXDLLclass CException : public CObject#elseclass AFX_NOVTABLE CException : public CObject#endif
d:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\afx.h中:

class AFX_NOVTABLE CException : public CObject{      //................}
对比代码可发现VC6.0中的CException类宏定义默认为_AFXDLL,所以采用的是class CException:public CObject的派生方式。

VS2010中的CException类宏定义只有AFX_NOVTABLE,查看AFX_NOVTABLE定义:

#define AFX_NOVTABLE __declspec(novtable)
__declspec(novtable) 在C++中接口中广泛应用, __declspec(novtable) 就是让不允许类有虚函数表以及对虚函数表的初始化代码, 这样可以节省运行时间和空间. 但是这个类一定不允许生成实例, 因为没有虚函数表, 就无法对虚函数进行调用.。所以在VS2010中下述代码会出错:

throw new CException;
解决办法一:如果不需对各种异常进行处理处理,只需要报错的情况下,可将代码改为:

throw L"Error!"
解决办法二:将其替换成CException的派生类,CMemoryException、CFileException等,视情况而定。

3、VC6.0向导生成对3D效果控件的支持产生的警告

warning C4996: 'CWinApp::Enable3dControls': CWinApp::Enable3dControls is no longer needed. You should remove this call

报警告的代码如下:

#ifdef _AFXDLLEnable3dControls();// Call this when using MFC in a shared DLL#elseEnable3dControlsStatic();// Call this when linking to MFC statically#endif
可修改为:
#if _MSC_VER <= 1200 //VC6.0版本其前发行的版本,详见msdn    #ifdef _AFXDLL        Enable3dControls();            // Call this when using MFC in a shared DLL    #else        Enable3dControlsStatic();    // Call this when linking to MFC statically    #endif#endif


0 0
原创粉丝点击