几个VC6.0到VC9.0的错误解决方案
说起现在这个引擎吧,总是没有太多时间去写,不过在半个月前就已经完成了,而且在VC6.0上是完全通过的,两个DEMO的运行也完全正常,昨天学人家追追新流,一改往日的固执,装了个VC9.0,结果出了几十个Warning,还有15个ERROR,这些都是因为VC6.0到VC9.0的转换上,还有处理规则有所变动产生了.如下是我的解决方案,希望对大家有所帮助,因为这个引擎目前还不到发布时间,所以不会有大量的源码帖出,敬请原谅:
1.C4430和C4996警告,因为我们是在/W3下Debug,所以会出现好多这种Warning,根据我的经验,如果我们对自己的代码和DEMO非常有信心的情况下,这些警告是多余的,我们真正要去解决的是ERRORs,所以我们先把WARNING全都去了,要不然看着让人烦.....
方法非常简单: 在命令列加入/wd4430 /wd4996,.....是不是非常简单,
好了,现在把这几十个WARNING的编译信息去掉后,看着就不烦了,心情好多了.留给我们接下来真正要解决的东西出如下:
2.error C2440: 'return' : 無法由 'void' 轉換為 'int' :
产生这种错误的原因吧,我开始也进入了误区,我直接回头去检查代码里的RETURN,浪费了不少时间,其实这个错误是因为,在Standard C++程式库中所执行的一致性和更新工作产生的.源码如下:
// 设置音效音量
inline SetEffectVolume(float fVolume)
{ return SetGroupVolume(fVolume, m_lstEffect); } //C2240
在Standard C++下,是不会自动去转换的,其实这不是我们代码的问题,是VC7.0开始的一个检查更改,我们要做的就是迎合VC9.0就行,不必大幅改动我们的代码部分,方案如下:
// 设置音效音量
void SetEffectVolume(float fVolume)
{ return SetGroupVolume(fVolume, m_lstEffect); } //It's OK.....
3. error C3867: 'MyForm::ButtonCtrlClick': 函式呼叫遺漏引數清單,請用 '&MyForm::ButtonCtrlClick' 建立成員的指標
其实这也是VS2005之后的一个更变引起的.对VC++2005的编译器完成一致性处理后也可能会产生这种错误:增强型成员指标一致性.
//代码如下:
// Panel2 setting
Panel2.Create(this, 545, 0, pan2bg);
ButtonGame.Create(&Panel2, 49, 128, btnbig, "游戏性(G)");
ButtonGame.SetDownOffset(-1, 3);
ON_CLICK(&ButtonGame, ButtonCtrlClick); //C3867
ButtonVideo.Create(&Panel2, 49, 187, btnbig, "图像(V)");
ButtonVideo.SetDownOffset(-1, 3);
ON_CLICK(&ButtonVideo, ButtonCtrlClick);//C3867
ButtonSound.Create(&Panel2, 49, 246, btnbig, "声音(S)");
ButtonSound.SetDownOffset(-1, 3);
ON_CLICK(&ButtonSound, ButtonCtrlClick);//C3867
VS2005以后,在建立指标时,必须用&来建立和传递,哎,还真麻烦,不过这种较以往的会更安全.所以不要报怨,这种考虑是必要的.呵呵,微软还挺周道的.不错,小小表扬一下.如果用微软给的方法来解决,很麻烦,我这人向来比较懒,所以我用的方法是,ON_CLICK(&ButtonVideo, ButtonCtrlClick());//It's OK...
4.error C2440: '<function-style-cast>' : 無法由 'void' 轉換為 'GEng::NotifyFun'
我不废话了,还是一个RETURN的检查引起的问题.改吧....
可能性1:宏定义在导入VC9.0时顺序换了位.在MAIN.CPP前面加上宏定义头文件"GENG_GUIOBJ.H",错误依旧
可能性2:宏定义里地址传递上,方法不能在VC9.0里体现.
typedef void (GEngControl::*NotifyFun)(void); //定义部分代码
struct NotifyEvent
{
NotifyEvent() : function(NULL), invoker(NULL) {}
NotifyFun function;
GEngControl *invoker;
}; //没有类型转换过程.....查看控件定义里....
//控件定义部分代码:
#define ON_CLICK(obj, fun) /
{ /
(obj)->OnClick.function = NotifyFun(fun); / //C2440
(obj)->OnClick.invoker = this; /
}
在这里,只有一种方法可行,也必须这么改,如果没有经验的话,一般不知道如何下手.方案如下:
(obj*)->OnClick.function = NotifyFun(fun); / //C2440
(obj*)->OnClick.invoker = this; /
到此为止,终于成功地从VC6.0转到了VC9.0上.
总结:其实VC的高版本改变往往是为了更安全,为了我们的程序在编译成功后运行更建全考虑的,不要怕麻烦,不要一出错就换低版本的,呵呵....
牙疼两天了,今天还没吃饭呢,好饿,但牙不争气,看见饭就烦.先写这么多吧.有什么问题,留言就行了.大家一起研究,我的GEng2D游戏引擎总算在VC9.0上安了家,还出了DEBUG版.明天看有时间把DEMO也在VC9.0编译一下不,然后发出来,让大家指教指教......