2009-07-30 6 views
35

Est-il possible d'imprimer vers stderr la valeur d'une variable de préprocesseur dans C? Par exemple, ce que j'ai droit est maintenant:Est-il possible d'imprimer une variable de préprocesseur en C?

#define PP_VAR (10) 
#if (PP_VAR > 10) 
    #warning PP_VAR is greater than 10 
#endif 

Mais ce que je voudrais faire est:

#define PP_VAR (10) 
#if (PP_VAR > 10) 
    #warning PP_VAR=%PP_VAR% 
#endif 

est quelque chose comme cela possible dans C?

Répondre

41

Vous pouvez imprimer la valeur d'une variable de préprocesseur sous visual studio. Les éléments suivants impriment la valeur de _MSC_VER:

#define STRING2(x) #x 
#define STRING(x) STRING2(x) 

#pragma message(STRING(_MSC_VER)) 

Vous ne savez pas quel est le niveau standard.

+2

Ce n'est pas standard, mais GCC, MSVC, CLANG ... (probablement d'autres le soutiennent aussi) – ideasman42

0

Eh bien, ce que vous faites n'est pas standard. Premièrement, la directive "#warning" ou "#warn" n'est pas standard. En second lieu, lorsque vous utilisez le préprocesseur, la ligne doit commencer par le symbole dièse, sans espaces:

 
#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 

Puisque vous utilisez déjà une extension non standard, vous devrez consulter la documentation du préprocesseur particulier/compilateur que vous utilisez pour voir ce qu'il dit à propos de "#warning".

+5

Votre deuxième point est incorrect - C89 a levé cette restriction. Le # doit être le premier symbole de la ligne, mais il peut être précédé d'un espace blanc (mais pas de commentaires). –

+0

Merci. Je ne peux pas croire que je vis encore dans les âges sombres. Pouvez-vous me montrer le document pertinent pour cela? –

+0

Wow. Je suis venu plus tard au jeu que je ne le pensais - je n'ai jamais été au courant de cette restriction. –

2

Utilisez l'opérateur-collage jeton préprocesseur: ## TOKEN_NAME

Comme indiqué précédemment, les directives de préprocesseur que vous utilisez ne sont pas standard, donc YMMV.

3

De nombreux compilateurs C prennent en charge #warning (mais il n'est pas défini par le standard C).

Cependant, GCC ne fait au moins 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 
+7

Donc quand vous dites "il est difficile de voir la valeur d'une variable", ce que vous voulez vraiment dire, c'est que vous ne pouvez pas le voir. – Nick

+0

Grossièrement - oui; Je n'ai pas trouvé un moyen de le voir, ce qui n'est pas la même chose que "il n'y a aucun moyen de le voir". –

+0

Je *** pense *** c'est ce que j'essaie de faire .... Je veux savoir ce que la bibliothèque d'exécution définit 'SSIZE_MAX' en tant que chaîne (comme' 0', 'INT_MAX' ou' LONG_MAX '), mais le stringy retourne seulement' SSIZE_MAX' (le côté gauche de la définition). – jww

8

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 
Questions connexes