2010-09-18 82 views
5

我使用下面的代碼並試圖通過按F10在Visual Studio 2008中進行調試。使用#line控制時調試器的奇怪行爲

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

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

下面是調試器屏幕快照。

alt text

#行100告訴編譯器去排隊100,以獲取其下一行。 由於第100行不存在,它會在屏幕截圖所示的主函數之外。 如果我嘗試用F10調試代碼,控件永遠不會回到主函數。 儘管它正在執行main(),它仍然在主函數之外顯示指針。

如果我在的地方TEST.CPP的給其他的文件名,指針轉到該文件,但它不回來TEST.CPP

任何想法,爲什麼調試器的行爲就像這樣?

+0

簡短的回答:不使用#行,除非你真的知道自己在做什麼:-D – 2010-09-19 20:28:49

回答

8

該指令應該被代碼生成器使用。從一種語言翻譯到另一種語言的工具。因此,當您調試代碼時,調試器將顯示原始語言的源文件,逐步瀏覽該語言的語句。而不是翻譯的代碼中的(通常是隱晦的)陳述。

這不是你在這裏做的,你在指令中提供了無意義的信息。當你調試時顯然得到了無意義的結果。哥哥,垃圾,垃圾。刪除指令。

+1

+1 - 在那裏我已經看到了這個使用的情況下是對應於元代碼輸入其中代碼爲C++的語法分析生成包含元代碼中原始行號的引用。 – 2010-09-18 14:12:52

1

該指令不會改變實際的控制流量。它會在編譯期間改變編譯器生成的輸出。閱讀docs - 這是否解釋了爲什麼您會期望上述行爲?

對於C#有引用隱藏調試器的代碼行,但這仍然不會改變預期的控制流。

在這兩種語言中,您都必須在選擇所需的下一行代碼後使用"Set Next Statement"手動更改執行流程。將下一行代碼設置爲在當前作用域外執行可能會導致程序發生故障 - 引用的文檔中還有其他警告。