C Препроцессор, Stringify результат макроса
Я хочу сгладить результат расширения макроса.
Я пробовал следующее:
#define QUOTE(str) #str
#define TEST thisisatest
#define TESTE QUOTE(TEST)
И TESTE расширяется до: "TEST", в то время как я пытаюсь получить "thisisatest". Я знаю, что это правильное поведение препроцессора, но может ли кто-нибудь помочь мне с тем, чтобы достичь другого?
Using TESTE #TEST is not valid
Using TESTE QUOTE(thisisatest) is not what I'm trying to do
Ответы
Ответ 1
Вот так:
#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);
}
Причина в том, что при замене макросов в тело макроса они расширяются, если они не появляются с операторами # или ## препроцессора в этом макросе. Таким образом, str
(со значением TEST
в вашем коде) не расширяется в QUOTE
, но расширяется в EXPAND_AND_QUOTE
.
Ответ 2
Чтобы прояснить немного больше, по существу препроцессор был выполнен для выполнения другой "стадии". i.e:
1-й случай:
->TESTE
->QUOTE(TEST) # preprocessor encounters QUOTE
# first so it expands it *without expanding its argument*
# as the '#' symbol is used
->TEST
Второй случай:
->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