41 votes

Préprocesseur C, Stringify le résultat d'une macro

Je veux stringifier le résultat d'une expansion de macro.

J'ai essayé avec ce qui suit:

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

Et TESTE devient: "TEST", pendant que j'essaie d'obtenir "thisisatest". Je sais que c'est le comportement correct du pré-processeur, mais est-ce que quelqu'un peut m'aider avec un moyen de réaliser l'autre?

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

74voto

Steve Jessop Points 166970

Comme ça:

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

15voto

pratikm Points 558

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

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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X