Pregunta

¿Es posible imprimir a stderr el valor de una variable del preprocesador en C ? Por ejemplo, lo que tengo ahora es:

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

Pero lo que me gustaría hacer es:

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

¿Es posible algo como esto en C ?

¿Fue útil?

Solución

Puede imprimir el valor de una variable del preprocesador en Visual Studio. Lo siguiente imprime el valor de _MSC_VER:

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

#pragma message(STRING(_MSC_VER))

No estoy seguro de qué estándar es esto.

Otros consejos

Esto funciona con GCC 4.4.3:

#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message "LIBMEMCACHED_VERSION_HEX = " STRING(LIBMEMCACHED_VERSION_HEX)

rendimientos:

src/_pylibmcmodule.c:1843: note: #pragma message: LIBMEMCACHED_VERSION_HEX = 0x01000017

Muchos compiladores de C admiten #warning (pero no está definido por el estándar de C).

Sin embargo, GCC al menos no realiza un procesamiento previo de los datos que siguen, lo que significa que es difícil ver el valor de una 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 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

Utilice el operador de pegado de token del preprocesador: ## TOKEN_NAME

Como se señaló anteriormente, las directivas de preprocesador que está utilizando no son estándar, por lo tanto, YMMV.

Bueno, lo que estás haciendo es en realidad no estándar. En primer lugar, la " # advertencia " o " # advertir " Directiva no es estándar. En segundo lugar, cuando se utiliza el preprocesador, la línea debe comenzar con el símbolo de libra, sin espacios:

#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

Como ya está utilizando una extensión no estándar, deberá consultar la documentación del preprocesador / compilador en particular que está utilizando para ver lo que dice sobre " # warning " ;.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top