Препроцессор C, преобразование результата макроса в строку

Я хочу упорядочить результат расширения макроса.

Я пробовал со следующим:

#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

person almosnow    schedule 05.08.2010    source источник
comment
stackoverflow.com/questions/798221/c-macros-to -создать-строки   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 01.06.2015


Ответы (2)


Нравится:

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

person Steve Jessop    schedule 05.08.2010
comment
#define PE(BZL,YY) printf(ОШИБКА - #BZL : результат: 0x%08x!, YY); Выполнение: целая переменная1=1; PE(Тест1,переменная1); --› Печать результатов: ОШИБКА - Test1: результат: 0x1! - person Joniale; 04.06.2020

Чтобы уточнить немного больше, по сути, препроцессор был создан для выполнения другого «этапа». то есть:

1-й случай:

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

2-й случай:

->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
person pratikm    schedule 11.05.2011