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.
Réponses
Trop de publicités?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.
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
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
$