2010-09-18 19 views
5

Utilicé el código siguiente e intenté depurar en Visual Studio 2008 presionando F10.Comportamiento extraño del depurador cuando se utiliza el control #line

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

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

A continuación se muestra la captura de pantalla del depurador.

alt text

#line 100 dice compilador para ir a la línea 100 para obtener la siguiente línea. Como la línea 100 no existe, sale de la función principal como se muestra en la captura de pantalla. Si trato de depurar el código con F10, el control nunca vuelve a la función principal. Sigue mostrando el puntero fuera de la función principal aunque está ejecutando main().

si me dan otro nombre de archivo en lugar de test.cpp, puntero va a ese archivo, pero no vuelve a test.cpp

Cualquier idea de por qué depurador se comporta de esta manera?

+0

Respuesta corta: no use #line a menos que realmente sepa lo que está haciendo :-D –

Respuesta

8

Esta directiva debe ser utilizada por los generadores de códigos. Herramientas que se traducen de un idioma a otro. De modo que cuando depure ese código, el depurador mostrará el archivo fuente del idioma original, recorriendo las declaraciones de ese idioma. En lugar de las declaraciones (a menudo crípticas) en el código traducido.

Que no es lo que hizo aquí, está dando información sin sentido en la directiva. Y obviamente obtuve resultados sin sentido cuando depuraste. Gigo, basura adentro, basura afuera. Eliminar la directiva.

+1

+1 - el caso donde he visto esto usado es donde el código correspondiente a la entrada de metacódigo a un generador de analizador C++ contiene referencias a los números de línea originales en el metacódigo. –

1

La directiva no altera el flujo de control real. Altera la salida generada por el compilador durante la compilación. Lea el docs - ¿Esto explica por qué esperaría el comportamiento descrito anteriormente?

Para C# se hace referencia a la ocultación de líneas de código del depurador, pero esto aún no altera el flujo de control esperado.

En ambos idiomas, debe modificar el flujo de ejecución manualmente usando "Set Next Statement" después de seleccionar la siguiente línea de código requerida. Establecer la siguiente línea de código para ser ejecutada fuera del alcance actual puede causar un mal funcionamiento del programa; hay más advertencias en los documentos a los que se hace referencia.

Cuestiones relacionadas