Pergunta

Será que é possível imprimir para stderr o valor de uma variável pré-processador em C ? Por exemplo, o que eu tenho agora é:

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

Mas o que eu gostaria de fazer é:

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

É algo como isto possível em C ?

Foi útil?

Solução

Você pode imprimir o valor de uma variável pré-processador em visual studio. Os seguintes imprime o valor de _MSC_VER:

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

#pragma message(STRING(_MSC_VER))

Não sei como padrão este é apesar de tudo.

Outras dicas

Isso funciona com GCC 4.4.3:

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

rendimentos:

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

Muitos compiladores C apoio #warning (mas não é definida pelo padrão C).

No entanto, GCC, pelo menos não faz pré-processamento dos dados que se segue, que significa que é difícil ver o valor de uma variável.

#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 produz:

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

Use o pré-processador token-colando operador: ## TOKEN_NAME

Como observado anteriormente, as directivas de pré-processador que você está usando são não-padrão, assim YMMV.

Bem, o que você está fazendo é realmente fora do padrão. Em primeiro lugar, o "#WARNING" ou directiva "#warn" não é padrão. Em segundo lugar, ao usar o pré-processador, a linha deve começar com o símbolo de libra, sem espaços:

#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

Uma vez que você já está usando uma extensão não-padrão, você precisa olhar a documentação do pré-processador / compilador específico que você está usando para ver o que ele diz sobre "#WARNING".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top