198 votes

Comment puis-je afficher la valeur d'un #define au moment de la compilation?

J'essaie de déterminer quelle version de Boost mon code pense utiliser. Je veux faire quelque chose comme ça:

#error BOOST_VERSION

mais le préprocesseur ne développe pas BOOST_VERSION.

Je sais que je pourrais l’imprimer au moment de l’exécution à partir du programme, et je pourrais aussi regarder la sortie du pré-processeur pour trouver la réponse. Je pense qu’il serait utile d’avoir un moyen de faire cela pendant la compilation.

226voto

Chris Barry Points 57

Je sais que cela fait longtemps après la requête initiale, mais cela peut quand même être utile.

Cela peut être fait dans GCC en utilisant l'opérateur stringify "#", mais cela nécessite deux étapes.

 #define XSTR(x) STR(x)
#define STR(x) #x
 

La valeur d'une macro peut ensuite être affichée avec:

 #pragma message "The value of ABC: " XSTR(ABC)
 

Voir: 3.4 Stringification dans la documentation en ligne de gcc.

136voto

Jackie Yeh Points 211

BOOST_PP_STRINGIZE semble une excellente solution pour le C++, mais pas pour l'ordinaire C.

Voici ma solution pour GNU RPC:

/* Some test definition here */
#define DEFINED_BUT_NO_VALUE
#define DEFINED_INT 3
#define DEFINED_STR "ABC"

/* definition to expand macro then apply to pragma message */
#define VALUE_TO_STRING(x) #x
#define VALUE(x) VALUE_TO_STRING(x)
#define VAR_NAME_VALUE(var) #var "="  VALUE(var)

/* Some example here */
#pragma message(VAR_NAME_VALUE(NOT_DEFINED))
#pragma message(VAR_NAME_VALUE(DEFINED_BUT_NO_VALUE))
#pragma message(VAR_NAME_VALUE(DEFINED_INT))
#pragma message(VAR_NAME_VALUE(DEFINED_STR))

Définitions ci-dessus ont pour conséquence:

test.c:10:9: note: #pragma message: NOT_DEFINED=NOT_DEFINED
test.c:11:9: note: #pragma message: DEFINED_BUT_NO_VALUE=
test.c:12:9: note: #pragma message: DEFINED_INT=3
test.c:13:9: note: #pragma message: DEFINED_STR="ABC"

Pour ", défini comme le nombre entier", "défini comme une chaîne de caractères", et "défini mais pas de valeur" des variables , ils fonctionnent très bien. Seulement pour les "non défini" variable, elles affichent exactement le même que l'original nom de la variable. Vous avez utilisé pour, ou peut-être quelqu'un peut fournir une meilleure solution.

61voto

Bojan Resnik Points 4941

Si vous utilisez Visual C ++, vous pouvez utiliser #pragma message :

 #include <boost/preprocessor/stringize.hpp>
#pragma message("BOOST_VERSION=" BOOST_PP_STRINGIZE(BOOST_VERSION))
 

Edit: Merci à LB pour le lien

Apparemment, l'équivalent GCC est (non testé):

 #pragma message "BOOST_VERSION=" BOOST_PP_STRINGIZE(BOOST_VERSION)
 

15voto

KeyserSoze Points 2103

Autant que je sache, '#erreur " seulement imprimer des chaînes de caractères, en fait, vous n'avez même pas besoin d'utiliser des guillemets.

Avez-vous essayé d'écrire les différents volontairement incorrecte code à l'aide de "BOOST_VERSION"? Peut-être quelque chose comme "bla[BOOST_VERSION] = toto;" vous dira quelque chose comme "littéral de chaîne 1.2.1 ne peut pas être utilisé comme un tableau d'adresses". Il ne sera pas un joli message d'erreur, mais au moins il va vous montrer la valeur correspondante. Vous pouvez jouer jusqu'à ce que vous trouver une erreur de compilation qui ne vous dire la valeur.

3voto

fbrereto Points 21711

Vous pouvez également prétraiter le fichier source et voir à quoi correspond la valeur du préprocesseur.

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