使用#line控件时调试器的奇怪行为

时间:2010-09-18 11:52:02

标签: c++ visual-studio-2008

我使用下面的代码并尝试通过按F10在Visual Studio 2008中进行调试。

//test.cpp
#include<iostream>
using namespace std;

int main(void)
{
#line 100 "test.cpp"
   cout<<"Inside main()"<<endl;
   return 0;
}

以下是调试器屏幕截图。

alt text

#line 100告诉编译器转到第100行以获取其下一行。 由于第100行不存在,它将超出主要功能,如屏幕截图所示。 如果我尝试用F10调试代码,控制永远不会回到主函数。 它继续显示主函数外部的指针,即使它正在执行main()。

如果我给其他文件名代替test.cpp,指针会转到该文件,但它不会返回test.cpp

知道为什么调试器的行为是这样的吗?

2 个答案:

答案 0 :(得分:8)

代码生成器应该使用此指令。从一种语言翻译成另一种语言的工具。因此,当您调试该代码时,调试器将显示原始语言的源文件,逐步执行该语言的语句。而不是翻译代码中的(通常是神秘的)陈述。

这不是你在这里做的,你在指令中给出了无意义的信息。当你调试时,显然得到了无意义的结果。 Gigo,垃圾进,垃圾出来。删除指令。

答案 1 :(得分:1)

该指令不会改变实际的控制流程。它会改变编译期间编译器生成的输出。阅读docs - 这是否解释了为什么会出现上述行为?

对于C#,提到了从调试器隐藏代码行,但这仍然不会改变预期的控制流。

在两种语言中,您必须在选择所需的下一行代码后使用"Set Next Statement"手动更改执行流程。设置要在当前范围之外执行的下一行代码可能会导致程序出现故障 - 参考文档中还有其他警告。