C++ 代码在没有优化的情况下被奇怪地跳过。任何想法为什么?

标签 c++ gdb g++ gnu control-flow

我为此寻找了两天的答案,但没有成功。我以前从未遇到过这个问题,所以我会尽力而为。请耐心等待。

我回到一年多前创建的 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/

相关文章:

c++ - g++ 函数匹配和 OpenCV 2.3.0

c++ - 为什么 GCC 优化不适用于 valarrays?

c++ - 从基类解析 C++ 虚函数

C++ 递归可变参数 Lambda

C++ 排序字符而不是整个字符串

c++ - 用方括号 [] 初始化 std::vector<int> ;怎么了?

c++ - 在 C++ 中存储运行时变量

c++ - 如何让 GDB 显示每行输出的时间戳?

malloc() 和 free() 的 C 动态内存问题

debugging - malloc 中的电子围栏段错误