entrar en MACRO en VC ++

Estoy depurando un código fuente que tiene muchas # grandes rutinas definidas por MACRO. Estoy interesado en entrar en ellos, pero supongo que VC ++ no permite la funcionalidad paso a paso … así que,

  • Los estoy convirtiendo en funciones, pero esto se está volviendo difícil para mí.

¿Hay una manera de entrar en las rutinas MACRO? especialmente en VC ++?

PS: Puedo portar todo el código en gcc, si el comstackdor gcc admite entrar en MACRO

Además de todas las respuestas correctas anteriores: lo que suelo hacer es mostrar una pantalla mixta (ensamblaje C +). Esto muestra lo que realmente sucede. Incluso si no eres un experto en el ensamblaje subyacente, da una idea de lo que sucede (es decir, es un reemplazo trivial o un bucle complejo). También proporcionará oportunidades adicionales para entrar en funciones. Por ejemplo, si tu macro es

#define foo(a) i++;foo_func(a,i) 

su depurador mostrará algo como bucle y qué tipo de variables se utilizan). Puedes usar la definición de macro como referencia para entenderla.

 00411454 mov dword ptr [j],eax 00411457 cmp dword ptr [j],0Ah 0041145B jge wmain+58h (411478h) { foo(j); 0041145D mov eax,dword ptr [i] 00411460 add eax,1 00411463 mov dword ptr [i],eax 00411466 mov eax,dword ptr [i] 00411469 push eax 0041146A mov ecx,dword ptr [j] 0041146D push ecx 0041146E call foo_func (411028h) 00411473 add esp,8 } 

Esto da una pista de que las variables i y j se usan para llamar a la función foo_func.

Si usa Visual C ++, le permitirá ingresar a las funciones llamadas desde una macro (F11); aunque no declaraciones individuales.

Las macros son comstackdas por el preprocesador, por lo que el comstackdor será incapaz de generar información de depuración para pasar a través de las macros.

Respuesta larga. No.

Puede generar una lista completa de las macros expandidas en las opciones del comstackdor. Podría ayudar un poco, pero no le dará capacidades de depuración

Probablemente mi respuesta no sea útil para los usuarios de VC ++. En Unix, hago algo como esto:

 gcc -E prog.c | indent > prog-formatted.c 

Es decir, preprocesas el progtwig y lo reformateas.

Según mi conocimiento, el único depurador que podría ingresar a las macros está fuera del negocio (Softice). Gran ejemplo de por qué no deberías escribir macros de 50 líneas, de verdad. Entonces, en general … buena suerte.

Cuando se usa una macro, el código que está detrás se expande todo en la misma línea de código fuente, en lo que respecta al depurador. El depurador ve a MY_MACRO () y trata esa única línea sin importar cuánto código esté realmente dentro de la macro.

En C ++, las plantillas pueden hacer la mayoría de las cosas que pueden hacer las macros, pero funcionan de manera mucho más elegante. Ya que son una parte real del lenguaje, ¡usted también puede participar en el depurador! Por ejemplo:

 // Macro FIND() - ugly, buggy, and can't ever be stepped in to by debugger! #define FIND(begin, end, value) \ { \ for ( ; begin != end; ++begin) { \ if (*begin == value) \ break; \ } \ } // Templated find() - works beautifully and can be debugged like a real function! template Iter find(Iter begin, Iter end, const T& value) { for ( ; begin != end; ++begin) { if (*begin == value) return begin; } } 

Nota: find () es, por supuesto, una función de biblioteca estándar, pero simplemente escribí esto para compararla con una macro, para demostrar cómo se puede depurar. Sin mencionar que la versión macro tiene muchos otros problemas. Regla de oro: evite las macros para escribir código siempre que sea posible!