GCC vidage de préprocesseur
Est-il un moyen pour gcc/g++ pour vider son préprocesseur définit à partir de la ligne de commande?
Je veux dire des choses comme __GNUC__
, __STDC__
, et ainsi de suite.
Vous devez vous connecter pour publier un commentaire.
Oui, l'utilisation
-E -dM
options au lieu de -c.Exemple (sorties à stdout):
Pour C++
De la manuel de gcc:
echo | gcc -dM -E -
fonctionne sur windows ainsi.cpp -dM -E - < NUL
peut être utilisé.J'ai l'habitude de le faire de cette façon:
Noter que certains préprocesseur sont dépendants sur les options de ligne de commande - vous pouvez le tester en ajoutant les options qui s'appliquent au-dessus de la ligne de commande. Par exemple, pour voir ce qui SSE3/SSE4 options sont activées par défaut:
et ensuite la comparer quand
-msse4
est spécifié:De même, vous pouvez voir les options qui diffèrent entre les deux séries d'options de ligne de commande, par exemple, de comparer préprocesseur pour l'optimisation des niveaux de
-O0
(aucun) et-O3
(plein):Réponse tardive - j'ai trouvé les autres réponses utiles - et je voulais ajouter un petit supplément.
Comment puis-je jeter les macros du préprocesseur à venir à partir d'un fichier d'en-tête?
En particulier, je voulais voir ce que SOMAXCONN a été définie sur mon système. Je sais que je pourrais vous suffit d'ouvrir le fichier d'en-tête standard, mais parfois, j'ai chercher un peu pour trouver le fichier d'en-tête endroits. Au lieu de cela je peux utiliser ce one-liner:
L'approche simple (
gcc -dM -E - < /dev/null
) fonctionne très bien pour gcc, mais échoue pour g++. Récemment, j'ai requis un test pour un C++11 Et C++14 fonctionnalité. Recommandations pour leurs noms de macro sont publiés à https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations. Mais:échoue toujours, parce qu'il silencieusement appelle la C-conducteurs (comme si invoquée par
gcc
). Vous pouvez le voir en comparant sa sortie contre celle de gcc ou par l'ajout d'un g++-spécifique option de ligne de commande comme (-std=c++11) qui émet le message d'erreurcc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C
.Parce que (non C++) gcc vous jamais soutenir les Modèles "Alias" (voir http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf), vous devez ajouter le
-x c++
option pour forcer l'invocation du compilateur C++ (Crédits pour l'utilisation de la-x c++
options à la place d'un vide fichier factice aller à yuyichao, voir ci-dessous):Il n'y aura pas de sortie parce que g++ (révision 4.9.1, par défaut à -std=gnu++98) ne permet pas de C++11-fonctions par défaut. Pour ce faire, utilisez
qui, finalement, les rendements
notant que g++ 4.9.1 prend en charge les Modèles "Alias" lorsqu'il est invoqué avec
-std=c++11
.-x
argumentg++ -x c++ -dM -E -std=c++11 - < /dev/null | grep cpp
devrait fonctionner.Un portable approche qui fonctionne aussi bien sur Linux ou Windows (où il n'y a pas de /dev/null):
Pour le c++, vous pouvez utiliser (remplacer
c++11
avec quelle que soit la version que vous utilisez):Il fonctionne en disant gcc pour prétraiter stdin (qui est produite par echo) et imprimer toutes préprocesseur (recherche de
-dletters
). Si vous voulez savoir ce qui définit ce sont ajouté lorsque vous incluez un fichier d'en-tête vous pouvez utiliser-dD
option qui est similaire à-dM, mais n'inclut pas de macros prédéfinies:Noter, cependant, que d'entrée vide encore produit beaucoup d'définit avec
-dD
option.NUL
, vous êtes de retour à la case départ: il ne fonctionne pas sur les systèmes qui n'en ont pas.sort
se comporte un peu différent):echo | gcc -x c++ -std=c++17 -dM -E - | sort
echo | x86_64-w64-mingw32-gcc.exe -dM -E -
. Essayez de le lancer en cmd.exe pour vérifier que tout fonctionne correctement?Tout en travaillant dans un grand projet qui a complexe système de construction, et où il est difficile d'obtenir (ou de modifier) le gcc/g++ commande directement à il y a une autre façon de voir le résultat de l'expansion des macros.
Simplement redéfinir la macro, et vous obtenez un résultat similaire à la suivante: