我的 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;
时,一切都按预期工作。
那么这个损坏的方法如何编译得很好呢?
最佳答案
编译器不需要诊断该错误,因为通常静态分析不可能确定足够复杂的函数是否可以运行结束。相反,您会得到未定义的行为。
如果您启用了警告,希望您的编译器在这种情况下会发出警告。
关于c++ - 这个 bool 方法怎么能编译无误呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19400542/