2009-01-20 10 views
11

J'ai appris que le compilateur développera les macros lors de la compilation. Les modèles sont également développés au moment de la compilation. Est-il possible de voir ce code étendu? Je compile en utilisant Visual Studio 2008.Affichage du code étendu du compilateur - C++

toute pensée?

+7

Notez que la question pose également des questions sur l'extension du modèle, et la réponse sélectionnée ne répond pas à cette question. – TripShock

+0

[Question connexe] (http://stackoverflow.com/questions/5193867) a une réponse plus utile (bien que spécifique à gcc). Pour obtenir plus de code C++ que RTL, utilisez la famille d'options '-fdump-tree -...' comme '-fdump-tree-gimple' au lieu de' -fdump-rtl -... ' dans cette réponse. – Ruslan

Répondre

10

prend en charge quelques ligne de commande Le VC++ compilateur (de cl.exe) touches de commande:

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

commutateurs de ligne de commande supplémentaires peuvent être ajoutés dans les propriétés de votre projet. Dans ma version (VC2005), Options de configuration -> C/C++ -> Ligne de commande -> Options supplémentaires

2

Pour émettre le code prétraité, appelez directement cpp d'utiliser l'option -E dans gcc et les compilateurs associés; Je suis sûr que d'autres compilateurs ou suites ont des choses similaires (en effet, selon l'autre réponse, c'est/E ou/P dans VC++).

Vous ne savez pas comment sortir des modèles instanciés. C'est beaucoup plus difficile à faire, je pense, puisqu'il fait en fait partie de la compilation plutôt que du pré-traitement (du moins dans les compilateurs modernes, depuis la version cfront originale qui était un traducteur C++ -to-c, si je me souviens bien).

10

Le compilateur n'effectue pas de macro-expansion. C'est la tâche du pré-processeur. Tout cela apparaît comme une étape, mais le compilateur déborde réellement sur des tâches de pré-processeur séparées et piège la sortie pour vous.

modèles ne sont pas « développés » au moment de la compilation. Ils sont instanciés lors de l'utilisation lors de la compilation. La différence est que le compilateur génère immédiatement le code objet pour le modèle; il n'y a pas de code source intermédiaire qui sort. Vous ne pouvez pas regarder le code du modèle instancié comme source, il est exporté en tant qu'assemblage quand c'est nécessaire.

Si vous avez GCC, vous pouvez également appeler le pré-processeur directement à l'aide « cpp » avec les bons arguments (y compris la plupart des chemins et la ligne de commande définitions de macros). D'autres ont répondu pour MSVC.

+0

instancié lors de la compilation, _or linking_ (si vous (peut) utiliser l'exportation) – MSalters

+2

Cela dépend du compilateur - le pré-processeur fonctionne comme dans une étape distincte, mais il est pas obligatoire que c'est un programme distinct. –

4

Notez que/E dans VC++ ne fait qu'élargir déclarations de préprocesseur (qui est, #include, #ifdef, #define etc.)

Je ne suis pas au courant de tout compilateur moderne qui permet de développer des modèles.

1

Il est facile d'ajouter une option pour les compilateurs pour montrer la sortie après la substitution macro. Cela est défini comme une simple option de substitution de texte de toute façon. Beaucoup de compilateurs implémentent ceci comme une étape séparée, parfois même traitée comme un outil séparé. Dans tous les cas, le résultat de la substitution de macro est une collection d'unités de traduction sous forme de texte.

Modèles, d'autre part, sont compilées. Il y a plusieurs étapes à cela. Les noms sont résolus deux fois, par exemple. Dans chaque étape, le compilateur stocke le résultat de la recherche de nom. C'est une entrée de table. Comment le montrerais-tu sous forme de texte? Il n'y a pas d'expression C++ triviale pour ça.

Questions connexes