Est-il possible d'imprimer une variable de préprocesseur en C?
-
05-07-2019 - |
Question
Est-il possible d’imprimer sur stderr la valeur d’une variable du préprocesseur dans C ? Par exemple, ce que j’ai en ce moment est:
#define PP_VAR (10)
#if (PP_VAR > 10)
#warning PP_VAR is greater than 10
#endif
Mais ce que j'aimerais faire, c'est:
#define PP_VAR (10)
#if (PP_VAR > 10)
#warning PP_VAR=%PP_VAR%
#endif
Quelque chose comme cela est-il possible dans C ?
La solution
Vous pouvez imprimer la valeur d'une variable de préprocesseur sous visual studio. Ce qui suit imprime la valeur de _MSC_VER:
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message(STRING(_MSC_VER))
Je ne sais pas à quel point c'est standard.
Autres conseils
Ceci fonctionne avec GCC 4.4.3:
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message "LIBMEMCACHED_VERSION_HEX = " STRING(LIBMEMCACHED_VERSION_HEX)
donne:
src/_pylibmcmodule.c:1843: note: #pragma message: LIBMEMCACHED_VERSION_HEX = 0x01000017
De nombreux compilateurs C prennent en charge #warning
(mais cela n'est pas défini par le standard C).
Cependant, au moins GCC ne fait pas de pré-traitement sur les données qui suivent, ce qui signifie qu'il est difficile de voir la valeur d'une variable.
#define PP_VAR 123
#warning "Value of PP_VAR = " PP_VAR
#warning "Value of PP_VAR = " #PP_VAR
#warning "Value of PP_VAR = " ##PP_VAR
GCC produit:
x.c:2:2: warning: #warning "Value of PP_VAR = " PP_VAR
x.c:3:2: warning: #warning "Value of PP_VAR = " #PP_VAR
x.c:4:2: warning: #warning "Value of PP_VAR = " ##PP_VAR
Utilisez l'opérateur de collage de jetons du préprocesseur: ## TOKEN_NAME
Comme indiqué précédemment, les directives du préprocesseur que vous utilisez sont non standard, donc YMMV.
Eh bien, ce que vous faites est en fait non standard. Tout d’abord, le " # warning " ou " # avertir " directive n'est pas standard. Deuxièmement, lors de l’utilisation du préprocesseur, la ligne doit commencer par le symbole dièse, sans espace:
#ifdef BLAH1 # define BLAH2 // OK, because pound is at the very left. #endif #ifdef BLAH3 #define BLAH4 // Works on many compilers, but is non-standard. #endif
Etant donné que vous utilisez déjà une extension non standard, vous devez consulter la documentation du préprocesseur / compilateur particulier que vous utilisez pour voir ce qui est dit à propos de "# warning".