2010-08-05 11 views
39

Quiero aplicar una cadena al resultado de una expansión de macro.C Preprocesador, Stringify el resultado de una macro

He intentado con lo siguiente:

#define QUOTE(str) #str 
#define TEST thisisatest 
#define TESTE QUOTE(TEST) 

Y teste Obtiene ampliado para: "TEST", mientras que yo estoy tratando de conseguir "ThisIsATest". Sé que este es el comportamiento correcto del preprocesador, pero ¿alguien puede ayudarme con una manera de lograr el otro?

Using TESTE #TEST is not valid 
Using TESTE QUOTE(thisisatest) is not what I'm trying to do 
+1

http://stackoverflow.com/questions/798221/c-macros-to-create-strings –

Respuesta

68

De esta manera:

#include <stdio.h> 

#define QUOTE(str) #str 
#define EXPAND_AND_QUOTE(str) QUOTE(str) 
#define TEST thisisatest 
#define TESTE EXPAND_AND_QUOTE(TEST) 

int main() { 
    printf(TESTE); 
} 

La razón es que cuando los argumentos macro se sustituyen en el cuerpo de la macro, que se expanden a menos que aparecen con el # ## o los operadores del preprocesador en esa macro . Por lo tanto, str (con el valor TEST en su código) no se expande en QUOTE, pero se amplía en EXPAND_AND_QUOTE.

+0

1 Gracias mucho: D – almosnow

13

Para aclarar un poco más, esencialmente el preprocesador se hizo para ejecutar otra "etapa". es decir:

1er caso:

->TESTE 
->QUOTE(TEST) # preprocessor encounters QUOTE 
# first so it expands it *without expanding its argument* 
# as the '#' symbol is used 
->TEST 

segundo caso:

->TESTE 
->EXPAND_AND_QUOTE(TEST) 
->QUOTE(thisisatest) 
    # after expanding EXPAND_AND_QUOTE 
    # in the previous line 
    # the preprocessor checked for more macros 
    # to expand, it found TEST and expanded it 
    # to 'thisisatest' 
->thisisatest 
Cuestiones relacionadas