2009-07-30 16 views
35

È possibile stampare su stderr il valore di una variabile del preprocessore in C? Ad esempio, quello che ho in questo momento è:È possibile stampare una variabile del preprocessore in C?

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

Ma quello che vorrei fare è:

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

è qualcosa di simile possibile in C?

risposta

41

È possibile stampare il valore di una variabile preprocessore in Visual Studio. Quanto segue stampa il valore di _MSC_VER:

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

#pragma message(STRING(_MSC_VER)) 

Non so come standard questo è però.

+2

Non è standard, ma GCC, MSVC, CLANG ... (probabilmente anche altri lo supportano) – ideasman42

0

Bene, quello che stai facendo è in realtà non standard. In primo luogo, la direttiva "#warning" o "#warn" non è standard. In secondo luogo, quando si utilizza il preprocessore, la linea deve iniziare con il simbolo della lira, 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 

Dal momento che si sta già utilizzando un'estensione non standard, è necessario cercare la documentazione della particolare preprocessore/compilatore che stai usando per vedere cosa dice "#warning".

+5

tuo secondo punto non è corretto - C89 sollevato tale restrizione. Il # deve essere il primo simbolo sulla linea, ma può essere preceduto dallo spazio bianco (ma non dai commenti). –

+0

Grazie. Non posso credere che sto ancora vivendo nel buio. Puoi indicarmi il documento rilevante per quello? –

+0

Wow. Sono arrivato più tardi di quanto pensassi - non ho mai saputo nulla di questa restrizione. –

2

Utilizzare il preprocessore operatore token-incolla: ## TOKEN_NAME

Come notato in precedenza, le direttive del preprocessore che si sta utilizzando sono non-standard, in modo YMMV.

3

Molti compilatori C supportano #warning (ma non è definito dallo standard C).

Tuttavia, GCC almeno non esegue la 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 
+7

Quindi quando dici "è difficile vedere il valore di una variabile", ciò che intendi è che NON PUOI vederlo. – Nick

+0

Approssimativamente - sì; Non ho trovato un modo per vederlo, il che non è lo stesso di "non c'è modo di vederlo". –

+0

I *** think *** questo è quello che sto cercando di fare .... Voglio sapere che cosa la libreria di runtime sta definendo 'SSIZE_MAX' come una stringa (come' 0', 'INT_MAX' o' LONG_MAX '), ma il stringy restituisce solo' SSIZE_MAX' (il lato sinistro del define). – jww

8

Questo 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 
Problemi correlati