当我写这个问题时,我突然意识到,由于嵌入式和非嵌入式应用程序构建,我们可能正在使用两个版本的 Qt。我们都在使用gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
. 我的构建环境是:
QMake version 2.01a
Using Qt version 4.7.3 in /usr/local/Trolltech/QtEmbedded-4.7.3/lib
至少我的一位同事正在使用:
QMake version 2.01a
Using Qt version 4.7.2 in /usr/lib
我的两个同事在制作使用我的计算库的独立应用程序时遇到了问题。我们的主要应用程序和我的独立单元测试应用程序工作正常,我的调查发现我的代码没有问题。我得出的结论是,构建环境或编译器一定存在一些基本问题,因为在这两种情况下,我们都隔离了不稳定/非标准行为。我隔离的案例如下:
void className::functionName(float newDeltaTime)
{
float zero_ = 0;
std::cout << "newDeltaTime: " << newDeltaTime << std::endl;
std::cout << "zero_: " << zero_ << std::endl;
std::cout << "newDeltaTime > zero_: " << (newDeltaTime > zero_) << std::endl;
std::cout << "newDeltaTime > zero_: " << (newDeltaTime > zero_) << std::endl;
std::cout << "newDeltaTime > zero_: " << (newDeltaTime > zero_) << std::endl;
...
这输出:
newDeltaTime: 0.2
zero_: 0
newDeltaTime > zero_: 0
newDeltaTime > zero_: 1
newDeltaTime > zero_: 1
使用 gdb(由 QtCreator 运行),我们可以在每一行看到正确的变量值 - 未损坏。这对我来说真的很奇怪。调试器显示的变量没有变化,但完全相同的表达式第二次产生不同的值。
最初,我进行了一些错误检查,if(newDeltaTime > 0) { //do something } else { //log and throw }
我的老板向我展示了抛出值为 0.2 的异常的代码(如上所示)。我无法弄清楚这个问题。当我添加日志记录时,代码开始工作,但我注意到日志记录的布尔表达式值不正确。最后,我想多次记录表达式,得到如上所示的输出。
我觉得地面在摇晃 - 什么会导致这种情况发生?一切都编译没有错误,如果我们两次评估表达式并第二次使用结果,那么它似乎工作正常。当可能发生单事件扰动(空间辐射撞击电路和损害逻辑)时,我熟悉投票逻辑,但我不寒而栗地认为这里有必要......