web-dev-qa-db-fra.com

Est-il possible d'imprimer une variable de préprocesseur en C?

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 ?

45
apalopohapa

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.

57
MattM

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
13
Marc Abramowitz

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
5
Jonathan Leffler

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.

3
rtenhove

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".

1