2010-09-18 10 views
5

Użyłem pod kodem i próbowałem debugować w Visual studio 2008 naciskając F10.Dziwne zachowanie debuggera, gdy używana jest kontrola #line

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

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

Poniżej znajduje się zrzut ekranu debugera.

alt text

#line 100 informuje kompilator, aby przejść do wiersza 100, aby uzyskać jego następnego wiersza. Ponieważ 100 linia nie istnieje, wychodzi poza główną funkcję, jak pokazano na zrzucie ekranu. Jeśli spróbuję debugować kod za pomocą F10, sterowanie nigdy nie wróci do głównej funkcji. Wyświetla wskaźnik poza główną funkcją, nawet jeśli wykonuje on funkcję main().

jeśli dam inną nazwę pliku w miejscu test.cpp, wskaźnik idzie do tego pliku, ale nie wróci do test.cpp

jakiś pomysł, dlaczego debugger zachowuje się w ten sposób?

+0

Krótka odpowiedź: nie używaj #line, chyba że naprawdę wiesz, co robisz :-D –

Odpowiedz

8

Ta dyrektywa powinna być używana przez generatorów kodów. Narzędzia tłumaczące z jednego języka na inny. Tak więc, gdy debugujesz ten kod, debugger wyświetli plik źródłowy oryginalnego języka, przechodząc przez instrukcje tego języka. Zamiast (często tajemniczych) instrukcji w przetłumaczonym kodzie.

To nie jest to, co tu zrobiliście, podajecie bezsensowne informacje w dyrektywie. I oczywiście uzyskałem nonsensowne wyniki podczas debugowania. Gigo, wrzuć śmieci, wyrzuć śmieci. Usuń dyrektywę.

+1

+1 - przypadek, w którym widziałem, że jest używany, gdzie kod odpowiadający metakodom wprowadzonym do generatora analizatora C++ zawiera odniesienia do oryginalnych numerów linii w metakodach. –

1

Dyrektywa nie zmienia faktycznego przepływu sterowania. Zmienia wyjście generowane przez kompilator podczas kompilacji. Przeczytaj docs - czy to wyjaśnia, dlaczego spodziewałbyś się zachowania opisanego powyżej?

Dla C# istnieje odniesienie do ukrywania wierszy kodu z debuggera, ale to nadal nie zmienia oczekiwanego przepływu kontroli.

W obu językach trzeba ręcznie zmienić przepływ wykonania, używając "Set Next Statement" po wybraniu wymaganego następnego wiersza kodu. Ustawienie następnego wiersza kodu, który ma być wykonywany poza bieżącym zakresem, może spowodować nieprawidłowe działanie programu - istnieją dalsze zastrzeżenia w dokumentach referencyjnych.