Bonjour,
J'aurais voulu savoir s'il est possible de voir la transformation que fait le compilateur des lignes de métaprogrammation?
Comme par exemple avec les macros et -E de g++.
ps: je travaille avec g++.
Bonjour,
J'aurais voulu savoir s'il est possible de voir la transformation que fait le compilateur des lignes de métaprogrammation?
Comme par exemple avec les macros et -E de g++.
ps: je travaille avec g++.
Avec Boost, tu peux faire des printf, ce qui te permet d'afficher quelques résultats, mais pas tous.
Afficher un résultat de métaprog, c'est chaud, je trouve, enfin, ça dépend pas mal du programme
Je sais pas is je me sui bien fais comprendre...
dans l'exemple suivant:
Avec la ligne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 template<unsigned int> struct Factoriel{ enum{value=N*Factoriel<N-1>::value}; }; template<> struct Factoriel<0>{ enum{value=1;} };
g++ doit bien un moment transformer cette ligne en:
Code : Sélectionner tout - Visualiser dans une fenêtre à part unsigned f = Factoriel<5>::value;
N'y aurait il pas un moyen de l'arréter aprés cette transformation comme avec l'option -E pour les macros qui sont transformées au moment de la précompilation?
Code : Sélectionner tout - Visualiser dans une fenêtre à part unsigned f = 5*4*3*2*1*1;
Déjà pour que ce soit clair, au niveau des options de compilation il n'y a rien. Le traitement des méta-programmes n'est pas une phase séparée comme peut l'être le préprocessing, c'est intégré à la "compilation".
Ensuite pour ton exemple, le mieux est encore de regarder la sortie ASM générée. Même si tu n'y connais rien en assembleur, un tel enchaînement de constantes apparaîtra clairement.
Et puis surtout, personne ne sait où le compilo va s'arrêter, il peut très bien sortir la suite de multiplications que tu donnes, ou bien directement la constante finale.
Sans oublier que la méta-programmation ce n'est pas que du calcul de constantes, ça peut aussi être de la génération de types. Et là, pour voir des résultats intermédiaires...
Je n'en suis pas sur. J'attendais pour repondre parce que je voulais verifier. Il y a une serie d'options de dump (genre -ftree-dump) qui pourraient aider.Envoyé par Laurent Gomila
Exact.Le traitement des méta-programmes n'est pas une phase séparée comme peut l'être le préprocessing, c'est intégré à la "compilation".
J'imagine mal un compilateur ne pas mettre la constante finale dans ce cas. Pour rappel c'est la valeur d'un enum et elle peut servir par exemple pour dimentionner un tableau et a d'autres endroits ou le C++ exige d'avoir une constante.Et puis surtout, personne ne sait où le compilo va s'arrêter, il peut très bien sortir la suite de multiplications que tu donnes, ou bien directement la constante finale.
Ca ne me semble pas rehidibitoire. Je suis sur que gnat -- la partie Ada de gcc -- permet un dump a un niveau de description "C" bien que ce soit une syntaxe Ada. Ca ne m'etonnerait pas, mais je ne suis pas certain, qu'une option disponible pour le C++ le fasse aussi. Mais il faut se taper le manuel et peut-etre experimenter un peu et j'ai pas le temps maintenant.Sans oublier que la méta-programmation ce n'est pas que du calcul de constantes, ça peut aussi être de la génération de types. Et là, pour voir des résultats intermédiaires...
Intéressant. Tu as plus de précisions sur ces options ?Je n'en suis pas sur. J'attendais pour repondre parce que je voulais verifier. Il y a une serie d'options de dump (genre -ftree-dump) qui pourraient aider.
Dans ce cas là oui, c'est vrai. Mais si on prend l'exemple d'un meta-programme qui calcule une fonction, a priori avec l'inlining on ne sait pas trop jusqu'où on va arriver. J'avais fait quelques tests : pour la fonction arctangente hyperbolique que je donne dans mon tutoriel, le compilo m'avait généré une suite de N additions de constantes, ou quelque chose de ce genre.J'imagine mal un compilateur ne pas mettre la constante finale dans ce cas. Pour rappel c'est la valeur d'un enum et elle peut servir par exemple pour dimentionner un tableau et a d'autres endroits ou le C++ exige d'avoir une constante.
Intéressant aussi.Ca ne me semble pas rehidibitoire. Je suis sur que gnat -- la partie Ada de gcc -- permet un dump a un niveau de description "C" bien que ce soit une syntaxe Ada. Ca ne m'etonnerait pas, mais je ne suis pas certain, qu'une option disponible pour le C++ le fasse aussi. Mais il faut se taper le manuel et peut-etre experimenter un peu et j'ai pas le temps maintenant.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager