Cómo expandir/”preprocesar” el código de plantilla de C++

2 minutos de lectura

avatar de usuario
tiburones

Para depurar adecuadamente macros complejas en C++, generalmente ejecuto el preprocesador en ellas para ver exactamente cómo se ve el código resultante.

¿Existe una forma similar de “preprocesar” el código de la plantilla?

avatar de usuario
inconformista

Una forma (dependiente del compilador) es usar el volcado después de cada paso del compilador. Escribí un pequeño programa:

template<class T>
T square(T n)
{
    return n * n;
}

int main(void)
{
    square<int>(3);
    square<float>(3.0);
}

después:

g++ -fdump-rtl-all test.cc

Esto me da un montón de archivos. Eche un vistazo a (en mi caso) test.cc.218.dfinish:

;; Function int main() (main)
;; Function T square(T) [with T = int] (_Z6squareIiET_S0_)
;; Function T square(T) [with T = float] (_Z6squareIfET_S0_)

avatar de usuario
Matthieu M.

El compilador CLang presenta una opción -emit-ast que vuelca el árbol de sintaxis abstracta utilizado para representar el lenguaje analizado. Se representarán las distintas instanciaciones de la plantilla.

El AST se representa tanto en memoria como en versión xml, por lo que puedes:

  • solo usa la salida XML
  • analizarlo, luego producir un código C++
  • crear una herramienta de reescritura (compatible directamente con CLang) y consumir el AST en sí mismo

Para la mayoría de las inspecciones de código (incluida la verificación de las sobrecargas seleccionadas), descubrí que leer la salida XML (bueno, analizarla) fue suficiente para mis necesidades.

  • cobertura eliminada 🙂

    – xaxxon

    21 de agosto de 2018 a las 1:40

Esta es una pregunta bastante antigua, pero creo que ha habido mejoras significativas en esta área que no son tan conocidas (todavía).

Metacapa se puede usar como una especie de gdb para instanciaciones de plantillas. Esto (hasta donde yo sé) se basa en herramientas de sonido metálico.

ingrese la descripción de la imagen aquí

¿Ha sido útil esta solución?