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?
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_)
-
¿Alguien sabe si hay un cambio similar para los compiladores de Visual Studio?
– RojoX
30 de mayo de 2012 a las 7:53
-
Lo único que se me ocurre es usar Modelo de código de Visual C++. no se si esto te puede ayudar
– inconformista
30 de mayo de 2012 a las 8:01
-
compilaciones GCC
src
=> GENÉRICO => GIMPLE => RTL =>asm
. Para volcar uso GENERIC/GIMPLE-fdump-tree-...
(Árboles GENÉRICOS de C/C++ utilice una sintaxis similar a la del idioma de origen). Más información en Sección del manual de GCC sobre opciones de depuración y el Manual interno de GCC.– impensado
6 de diciembre de 2012 a las 10:43
-
@maverik, cuando se trata de una clase, no de una función, ¿seguirá funcionando de esta manera?
– cong
29 de marzo de 2017 a las 1:15
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.