269 votes

Le préprocesseur de vidage GCC définit

Existe-t-il un moyen pour gcc / g ++ de vider ses définitions de préprocesseur de la ligne de commande? Je veux dire des choses comme __GNUC__ , __STDC__ , et ainsi de suite.

331voto

philant Points 17345

Oui, utilisez -E -dM "options -c. Exemple (sorties à stdout):

 gcc -dM -E - < /dev/null

À partir du manuel de gcc:

Au lieu de l'habituelle sortie, de générer des une liste de "#define " directives pour tous les macros définies au cours de l' l'exécution du préprocesseur, y compris les macros prédéfinies. Cette vous donne un moyen de savoir ce qui est prédéfinis dans votre version de l' préprocesseur. En supposant que vous n'avez pas de fichier foo.h, la commande

touch foo.h; cpp -dM foo.h

affiche toutes les macros prédéfinies.

Si vous utilisez-dM sans l'option-E, -dM est interprété comme un synonyme pour -fdump-rtl-mach.

81voto

Paul R Points 104036

J'ai l'habitude de le faire de cette façon:

$ gcc -dM -E - < /dev/null

Notez 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:

$ gcc -dM -E - < /dev/null | grep SSE[34]
#define __SSE3__ 1
#define __SSSE3__ 1

et puis comparer ce lors de l' -msse4 est spécifié:

$ gcc -dM -E -msse4 - < /dev/null | grep SSE[34]
#define __SSE3__ 1
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSSE3__ 1

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 d' -O0 (aucun) et -O3 (plein):

$ gcc -dM -E -O0 - < /dev/null > /tmp/O0.txt
$ gcc -dM -E -O3 - < /dev/null > /tmp/O3.txt
$ sdiff -s /tmp/O0.txt /tmp/O3.txt 
#define __NO_INLINE__ 1        <
                               > #define __OPTIMIZE__ 1

48voto

DigitalTrauma Points 6235

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?

echo "#include <sys/socket.h>" | gcc -E -dM -

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:

$ echo "#include <sys/socket.h>" | gcc -E -dM - | grep SOMAXCONN
#define SOMAXCONN 128
$ 

25voto

Pavel Points 1715

echo | gcc -dM -E -

pour les systèmes qui n'ont pas / dev / null (windows par exemple)

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