È possibile stampare una variabile del preprocessore in C?
-
05-07-2019 - |
Domanda
È possibile stampare su stderr il valore di una variabile del preprocessore in C ? Ad esempio, quello che ho in questo momento è:
#define PP_VAR (10)
#if (PP_VAR > 10)
#warning PP_VAR is greater than 10
#endif
Ma quello che mi piacerebbe fare è:
#define PP_VAR (10)
#if (PP_VAR > 10)
#warning PP_VAR=%PP_VAR%
#endif
È possibile una cosa del genere in C ?
Soluzione
È possibile stampare il valore di una variabile del preprocessore in Visual Studio. Di seguito viene stampato il valore di _MSC_VER:
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message(STRING(_MSC_VER))
Non sono sicuro di quanto sia standard.
Altri suggerimenti
Funziona con GCC 4.4.3:
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message "LIBMEMCACHED_VERSION_HEX = " STRING(LIBMEMCACHED_VERSION_HEX)
rendimenti:
src/_pylibmcmodule.c:1843: note: #pragma message: LIBMEMCACHED_VERSION_HEX = 0x01000017
Molti compilatori C supportano #warning
(ma non è definito dallo standard C).
Tuttavia, almeno GCC non esegue pre-elaborazione sui dati che seguono, il che significa che è difficile vedere il valore di una variabile.
#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 produce:
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
Utilizza l'operatore di incollaggio token del preprocessore: ## TOKEN_NAME
Come notato in precedenza, le direttive del preprocessore in uso non sono standard, quindi YMMV.
Bene, quello che stai facendo è in realtà non standard. Innanzitutto, l '"avviso #" " o " # warn " la direttiva non è standard. In secondo luogo, quando si utilizza il preprocessore, la linea deve iniziare con il simbolo della sterlina, senza spazi:
#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
Poiché stai già utilizzando un'estensione non standard, dovrai consultare la documentazione del particolare preprocessore / compilatore che stai utilizzando per vedere cosa dice "quotazione #" " ;.