我为此寻找了两天的答案,但没有成功。我以前从未遇到过这个问题,所以我会尽力而为。请耐心等待。
我回到一年多前创建的 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 单步执行代码(没有优化)时,我注意到 GDB 每次在到达 if (id == 30000)
后都会直接跳转到 else 语句。因为这些数字是十六进制表示法中的 C 宏,所以一开始我没有注意到 40000
超出了 signed short
的限制。这是非常具有误导性的,并且花了几个小时试图弄清楚:我重新编译了外部库,重新安装了 g++,等等。
显然,将 id
设为 unsigned short
可以解决问题。另一个问题似乎是编译器问题。但是我还是不明白,为什么那段代码在执行的时候完全跳过了,没有优化?为什么它不通过每个 if
语句,这样我就可以确定真正的问题?有什么想法吗?
非常感谢。我希望这对第一个问题没问题。
最佳答案
如果您启用来自 gcc 的所有警告,它会在编译时告诉您这将要发生。
关于C++ 代码在没有优化的情况下被奇怪地跳过。任何想法为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4770240/