45 votes

Comment développer / "prétraiter" le code de modèle c ++

Pour bien déboguer des macros complexes en c ++, j'utilise généralement le préprocesseur afin de voir exactement à quoi ressemble le code obtenu.

Existe-t-il une méthode similaire pour "prétraiter" le code de modèle?

21voto

maverik Points 3048

Un moyen (dépendant du compilateur) consiste à utiliser le dumping après chaque étape du compilateur. J'ai écrit un petit programme:

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

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

puis:

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

Cela me donne un tas de fichiers. Jetez un coup d'oeil à (dans mon cas) 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_)
 

8voto

Matthieu M. Points 101624

J'ai une demi-âne réponse seulement.

Je ne sais pas de manière à obtenir effectivement la source C++ (déjà existant), mais le compilateur CLang dispose d'une option d' -emit-ast qui vidages de l'Arbre de Syntaxe Abstraite utilisée pour représenter l'analyse de la langue. Les différentes instanciations du modèle seront représentés.

L'AST est représenté à la fois dans la mémoire et dans le fichier xml version, de sorte que vous pouvez:

  • suffit d'utiliser la sortie XML
  • l'analyser, puis de produire certains de code C++
  • créer un outil de Graveur (pris en charge directement dans CLang) et de consommer de l'AST lui-même

Pour la plupart des inspections de code (y compris la vérification de l'surcharges sélectionné), j'ai trouvé qu'en fait la lecture de la sortie XML (bien, grepping à travers elle) était suffisante pour mes besoins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X