OpenGL + Win32 SDK 开发框架的搭建(C++语言版)(先补上一个问题!!)

来源:互联网 发布:js 数组最大值下标 编辑:程序博客网 时间:2024/05/22 05:27

(具体内容有时间补上去。)

/***************************************************************************************************************************

这里先记录开发中碰到的一个问题。


背景介绍:

OpenGL + Win32 SDK编程,使用C++语言。

使用VS2008,使用Debug生成或者Release生成。

一个父类GLWindow,该类有虚方法Method1(), Method2(), ... MethodN()。

两个子类Win1, Win2都单继承自GLWindow,分别重载了Method1(), Method2(), ... MethodN()。


在主程序中,动态生成两个子类各一个实例。

GLWindow * pWnd1 = new Win1();

GLWindow * pWnd2 = new Win2();

我想看到多态特性。


现象:

在使用Debug生成时一切正常,使用Release生成时有问题,如下:

调用pWnd1.Method1(), pWnd2.Method1(),运行正确,能够进入各自的方法。

调用pWnd1.Method2(), pWnd2.Method2(),运行正确,能够进入各自的方法。

调用pWnd1.Method3(), pWnd2.Method3(),结果pWnd1.Method3()总是进不去,直接进入pWnd2.Method3()方法 【使用单步跟踪~~】

...  (其他的方法有的正常,有的也出现上述问题)


分析:

观察后发现,Method3方法在Win1和Win2子类中实现时的代码是一模一样的,所以其中一个的代码被优化掉了!(其实,在机器看来,执行效果是一样的,可是程序员看到就要纳闷了)

如果改动了其中任何一个的实现,则运行过程是对的。如果不改动代码,使用Debug模式结果总是正确的。

我尝试修改Debug和Release两种配置,更改了很多选项都不能解决问题。


总结:

1. 使用Release和Debug模式是有很多区别的,编译器和连接器提供的选项需要不断的去熟悉。

2. 虽然上面的现象不影响程序运行结果,但是总归有点不祥之兆。也许是我大惊小怪了,只是IDE不够智能?亦或是编译连接程序已经给优化掉了?至此我尚不知原因。

3. 但我还是发现了Release模式时可能会影响程序运行结果的一种情况。使用"assert(DoSomething());"这句代码,将会导致DoSomething()不被执行。需要使用替代语法"BOOL ret = DoSomething(); assert(ret);"。这个问题也曾经困扰了我多时。

***************************************************************************************************************************/


0 0