Est-il possible d'imprimer sur stderr la valeur d'une variable de préprocesseur en C ? Par exemple, ce que j'ai en ce moment, c'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
Est-ce que quelque chose comme ça est possible dans C ?
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.
Cela fonctionne avec GCC 4.4.3:
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message "LIBMEMCACHED_VERSION_HEX = " STRING(LIBMEMCACHED_VERSION_HEX)
rendements:
src/_pylibmcmodule.c:1843: note: #pragma message: LIBMEMCACHED_VERSION_HEX = 0x01000017
De nombreux compilateurs C prennent en charge #warning
(mais il n'est pas défini par la norme C).
Cependant, GCC au moins 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 de préprocesseur que vous utilisez ne sont pas standard, donc YMMV.
Eh bien, ce que vous faites est en fait non standard. Premièrement, la directive "#warning" ou "#warn" n'est pas standard. Deuxièmement, lors de l'utilisation du préprocesseur, la ligne doit commencer par le symbole dièse, sans aucun espace:
# ifdef BLAH1 # définit BLAH2 // OK, car la livre est à l'extrême gauche. # endif # ifdef BLAH3 #define BLAH4 // Fonctionne sur de nombreux compilateurs, mais n'est pas standard. # endif
Puisque vous utilisez déjà une extension non standard, vous devrez consulter la documentation du préprocesseur/compilateur particulier que vous utilisez pour voir ce qu'il dit à propos de "#warning".