我的C ++程序中有这个方法,在Visual Studio 2012中,标准编译器:
bool FPS::frameRenderingQueued(const Ogre::FrameEvent &evt) {
bool result = BaseApplication::frameRenderingQueued(evt);
if (!result) {
Ogre::LogManager::getSingleton().logMessage("Exiting, result of frame rendereing queued: " + result);
return result;
}
for (int x = 0; x < 20; x++) {
for (int z = 0; z < 20; z++) {
robotAnimation[x][z]->addTime(evt.timeSinceLastFrame);
tileSceneNode[x][z]->translate(tileSceneNode[x][z]->getOrientation() * Ogre::Vector3::UNIT_X * 35.0f * evt.timeSinceLastFrame);
}
}
}
如何在不给出任何错误的情况下编译?我记得你的结果是不可预测的。
当我运行时,发生了这种情况:函数本身返回false
(如果frameRenderingQueued()
返回false
,Ogre会关闭。但是从未到达分支if (!result) { ... }
所以这种行为是不可预测的。
稍后当我在函数末尾添加return true;
时,一切都按预期工作。
那么这个破碎的方法怎么能编译好呢?
答案 0 :(得分:3)
编译器不需要诊断该错误,因为通常静态分析不可能确定一个足够复杂的函数是否可以运行到最后。相反,你会得到未定义的行为。
希望您的编译器在这种情况下会发出警告,如果您启用了警告。
答案 1 :(得分:2)
您是否关闭了警告?对我来说,在VS2012中,类似的功能产生:
warning C4715: 'frameRenderingQueued' : not all control paths return a value
答案 2 :(得分:1)
行为未定义。这应该是编译器中的错误,但绝不是。您应该打开编译器的警告。
在这里详细了解为什么它是未定义的行为。 How do C++ progs get their return value, when a return is not specified in the function?
答案 3 :(得分:0)
未定义运行非void函数的结尾
行为。这意味着编译器不需要发出
一个诊断,它必须编译代码,除非它可以
证明你必然会不可避免地跑掉,这通常是
不可能。 (想象一下,例如,那个
BaseApplication::frameRenderingQueued
始终返回false
,
或者你打电话给的功能
tileSceneNode[x][z]->translate(...)
总是抛出一个
异常。)
大多数编译器会警告上述代码。你应该 激活警告,并注意它们。