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