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 ?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top