É possível imprimir uma variável pré-processamento em C?
-
05-07-2019 - |
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 ?
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".