Existe-t-il un moyen pour gcc / g ++ de vider ses définitions de préprocesseur depuis la ligne de commande? Je veux dire des choses comme __GNUC__
, __STDC__
et ainsi de suite.
gcc
g++
c-preprocessor
Anycorn
la source
la source
echo | gcc -dM -E -
fonctionne également sur Windows.cpp -dM -E - < NUL
peut être utilisé.Je le fais généralement de cette façon:
Notez que certaines définitions de préprocesseur dépendent des options de ligne de commande - vous pouvez les tester en ajoutant les options pertinentes à la ligne de commande ci-dessus. Par exemple, pour voir quelles options SSE3 / SSE4 sont activées par défaut:
puis comparer ceci quand
-msse4
est spécifié:De même, vous pouvez voir quelles options diffèrent entre deux ensembles différents d'options de ligne de commande, par exemple comparer les définitions de préprocesseur pour les niveaux d'optimisation
-O0
(aucun) et-O3
(complet):la source
Réponse tardive - j'ai trouvé les autres réponses utiles - et je voulais en ajouter un peu plus.
Comment vider les macros de préprocesseur provenant d'un fichier d'en-tête particulier?
ou (merci à @mymedia pour la suggestion):
En particulier, je voulais voir à quoi SOMAXCONN était défini sur mon système. Je sais que je pourrais simplement ouvrir le fichier d'en-tête standard, mais parfois je dois chercher un peu pour trouver les emplacements du fichier d'en-tête. Au lieu de cela, je peux simplement utiliser ce one-liner:
la source
L'approche simple (
gcc -dM -E - < /dev/null
) fonctionne bien pour gcc mais échoue pour g ++. Récemment, j'ai eu besoin d'un test pour une fonctionnalité C ++ 11 / C ++ 14. Les recommandations pour leurs noms de macro correspondants sont publiées sur https://isocpp.org/std/stand-documents/sd-6-sg10-feature-test-recommendations . Mais:échoue toujours, car il appelle silencieusement les pilotes C (comme s'il était appelé par
gcc
). Vous pouvez le voir en comparant sa sortie avec celle de gcc ou en ajoutant une option de ligne de commande spécifique à g ++ 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 (le non C ++) gcc ne prendra jamais en charge les "alias de modèles" (voir http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf ), vous devez ajouter l'
-x c++
option à forcer l'invocation du compilateur C ++ (les crédits pour l'utilisation des-x c++
options au lieu d'un fichier factice vide vont à yuyichao, voir ci-dessous):Il n'y aura pas de sortie car g ++ (révision 4.9.1, par défaut -std = gnu ++ 98) n'active pas les fonctionnalités C ++ 11 par défaut. Pour ce faire, utilisez
qui donne finalement
notant que g ++ 4.9.1 prend en charge les "alias de modèles" lorsqu'il est appelé avec
-std=c++11
.la source
-x
argument etg++ -x c++ -dM -E -std=c++11 - < /dev/null | grep cpp
devrait donc fonctionner.Une approche portable qui fonctionne aussi bien sous Linux ou Windows (où il n'y a pas / dev / null):
Pour c ++, vous pouvez utiliser (remplacer
c++11
par la version que vous utilisez):Il fonctionne en disant à gcc de prétraiter stdin (qui est produit par echo) et d' imprimer toutes les définitions de préprocesseur (rechercher
-dletters
). Si vous voulez savoir quelles définitions sont ajoutées lorsque vous incluez un fichier d'en-tête, vous pouvez utiliser une-dD
option similaire à -dM mais qui n'inclut pas de macros prédéfinies:Notez cependant que l'entrée vide produit toujours beaucoup de définitions avec
-dD
option.la source
NUL
, vous êtes de retour à la case départ: cela ne fonctionnera pas sur les systèmes qui ne l'ont pas.sort
se comporte peu différemment):echo | gcc -x c++ -std=c++17 -dM -E - | sort
Tout en travaillant dans un grand projet qui a un système de construction complexe et où il est difficile d'obtenir (ou de modifier) directement la commande gcc / g ++, il existe une autre façon de voir le résultat de l'expansion des macros. Redéfinissez simplement la macro et vous obtiendrez une sortie similaire à la suivante:
la source