我为此寻找了两天的答案,但没有成功。我以前从未遇到过这个问题,所以我会尽力而为。请多多包涵。
我回到了我一年多前创建的一个 C++ 项目,当时该项目运行没有问题。前几天,当我试图让相同的程序运行时,我遇到了这个有趣且令人难以置信的烦人问题。代码类似于:
文件.h
...
short id;
...
文件.cc
id = 0;
while (id < some_large_number)
{
id = foo();
if (id == 2)
{
//do something
}
else if (id == 2900)
{
//do something
}
else if (id == 30000)
{
//do something
}
else if (id == 40000)
{
//do something
}
else if (id == 45000)
{
//do something
}
else
{
//do something else
}
}
常数是我为本示例扩展的十六进制表示法的宏。事实证明,这确实是一个错误,但调试器并不容易发现。以下是发生的事情:
当我尝试使用 GDB 单步执行代码(没有优化)时,我注意到 GDBif (id == 30000)
每次到达后都会直接跳转到 else 语句。因为数字是十六进制的 c 宏,所以我一开始并没有注意到它40000
超出了 a 的限制signed short
。这非常具有误导性,并且花了几个小时试图弄清楚:我重新编译了外部库,重新安装了 g++,等等。
显然,解决id
了unsigned short
这个问题。另一个问题似乎是编译器问题。但是我还是不明白,为什么在执行过程中完全跳过了那些代码段,并且没有优化?为什么它不通过每个if
陈述,这样我就可以确定真正的问题?有任何想法吗?
非常感谢。我希望这对于第一个问题来说没问题。