2010-08-05 29 views
39

Je souhaite stringifier le résultat d'une expansion de macro.C Préprocesseur, Stringifier le résultat d'une macro

J'ai essayé avec les éléments suivants:

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

Et TESTE obtient étendu à: "TEST", alors que je suis en train de faire "ThisIsATest". Je sais que c'est le bon comportement du préprocesseur, mais est-ce que quelqu'un peut m'aider à atteindre l'autre?

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 –

Répondre

68

Comme ceci:

#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 raison en est que lorsque les arguments macro sont substitués dans le corps de la macro, ils sont développés moins ils apparaissent avec le # ou ## opérateurs de préprocesseur dans cette macro . Ainsi, str (avec la valeur TEST dans votre code) n'est pas développé dans QUOTE, mais il est développé dans EXPAND_AND_QUOTE.

+0

+1 Merci beaucoup: D – almosnow

13

Pour clarifier un peu plus, essentiellement le préprocesseur a été fait pour exécuter une autre "étape". à savoir:

1er cas:

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

2ème cas:

->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