为什么断点会在我的 C++ 代码中跳转?

Why a breakpoint jumps in my C++ code?

MS Visual Studio 2013.

我看到我的断点在运行时移动(C​​++ 代码)。我的 C# 代码中从来没有这样的行为,为什么我在 C++ 中得到这个?我该如何解决?

#include <Windows.h>
int main(){
  HANDLE hFile = ::CreateFile(TEXT(""), 0, 0, NULL, OPEN_EXISTING, 0, NULL);
  if (INVALID_HANDLE_VALUE == hFile){
    DWORD err_code = ::GetLastError();
  } // In the IDE I set the breackpoint on this line for err_code value looking...
  return(0); // but in runtime the breackpoint moved to this line.
             // It moved back when the work finished.
}

我知道在这种情况下我可以在 Watch window 中设置 @err,hr 来查找最后的错误信息,但断点行为对我来说很有趣。

VS 与 C++ 和 C# 的行为不同。在 C++ 的情况下,调试器将忽略不包含任何实际代码的行,并将继续移动断点,直到它遇到包含一些代码的行。

一个有点相关的行为是,如果您尝试在发布模式下进行调试,许多行将被优化掉,除非您知道发生了什么,否则会发现更多的怪异之处。

这就是它的工作原理。

在您的特定情况下,您实际上并没有对错误代码执行任何操作,只是将其分配给 if 语句的局部变量。在发布模式下,该行甚至整个 if 都将被优化掉,因为它没有任何效果。因此,您可以在以下行中将值输出到控制台,或者在 if 之前声明 err_code,在这种情况下,在结束 } 之后它仍然是 'alive'。