Je veux filtrer le résultat d'une expansion macro.
J'ai essayé avec ce qui suit:
#define QUOTE(str) #str
#define TEST thisisatest
#define TESTE QUOTE(TEST)
Et TESTE est étendu à: "TEST", pendant que j'essaye 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
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 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 développé dans QUOTE
, mais il est développé dans EXPAND_AND_QUOTE
.
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