2009-01-20 22 views
11

Me enteré de que el compilador ampliará las macros al compilar. Las plantillas también se expanden en el momento de la compilación. ¿Hay alguna forma de ver este código expandido? Estoy compilando utilizando Visual Studio 2008.Ver código ampliado del compilador - C++

alguna idea?

+7

Tenga en cuenta que la pregunta también se refiere a la expansión de la plantilla, y la respuesta seleccionada no responde. – TripShock

+0

[Pregunta relacionada] (http://stackoverflow.com/questions/5193867) tiene una respuesta más útil (aunque específica de gcc). Para obtener más código de alto nivel similar a C++ que RTL, use '-fdump-tree -...' familia de opciones como '-fdump-tree-gimple' en lugar de' -fdump-rtl -... 'sugeridas en esa respuesta. – Ruslan

Respuesta

10

El compilador de VC++ (cl.exe) es compatible con una línea de comandos algunos interruptores para esto:

/E preprocess to stdout 
/P preprocess to file 
/EP preproscess to stdout with no #lines 

interruptores de línea de comandos adicionales se pueden añadir en las propiedades del proyecto. En mi versión (VC2005), Opciones de configuración -> C/C++ -> Línea de comando -> Opciones adicionales

2

Para emitir el código preprocesado, llame directamente a cpp para usar la opción -E en gcc y compiladores relacionados; Estoy seguro de que otros compiladores o suites tienen cosas similares (de hecho, según la otra respuesta es/E o/P en VC++).

No estoy seguro sobre la salida de plantillas instanciadas. Eso es mucho más difícil de hacer, creo, ya que en realidad es parte de la compilación en lugar del preprocesamiento (al menos en los compiladores modernos, desde la versión cfront original que era un traductor de C++ a c, si no recuerdo mal).

10

El compilador en realidad no hace ninguna de las expansiones de macros. Esa es la tarea del preprocesador. Todo aparece como un paso, pero el compilador realmente se abre a tareas de preprocesador separadas y atrapa el resultado para usted.

Las plantillas no se "expanden" en tiempo de compilación. Se crean instancias sobre el uso durante la compilación. La diferencia es que el compilador genera inmediatamente código objeto para la plantilla; no hay un código fuente intermedio que aparezca. No se puede ver el código de plantilla instanciado como fuente, se desecha como ensamblaje cuando es necesario.

Si tiene GCC también puede llamar a la pre-procesador directamente a través de 'CPP' con los argumentos adecuados (en su mayoría incluyen caminos y las definiciones de línea de comandos de macro). Otros han respondido por MSVC.

+0

instanciada durante la compilación, _or linking_ (si (se) utiliza la exportación) – MSalters

+2

Depende del compilador - el pre-procesador funciona como si estuviera en una etapa separada, pero no es obligatorio que se trata de un programa separado. –

4

Tenga en cuenta que/E en VC++ sólo se expande declaraciones del preprocesador (es decir, # include, #ifdef, #define etc.)

No estoy al tanto de cualquier compilador moderna que permite ampliar las plantillas.

1

Es fácil añadir una opción para los compiladores para mostrar la salida después de la sustitución de macros. Eso se define como una simple opción de sustitución de texto de todos modos. Muchos compiladores implementan esto como una etapa separada, a veces incluso manejada como una herramienta separada. En cualquier caso, el resultado de la sustitución de macro es una colección de unidades de traducción en forma de texto.

plantillas, por el contrario, son recopilados. Hay múltiples etapas para esto. Los nombres se resuelven dos veces, por ejemplo. En cualquiera de las etapas, el compilador almacenaría el resultado de la búsqueda del nombre. Esa es una entrada de tabla. ¿Cómo lo mostrarías en forma de texto? No hay una expresión trivial de C++ para eso.

Cuestiones relacionadas