Как использовать строковый литерал в качестве аргумента макроса? - PullRequest
0 голосов
/ 10 июля 2020

Мой вопрос является обратным этому вопросу .

Я хочу написать макрос, который будет принимать целое число и строковый литерал в качестве аргументов, например:

#define STRING_MAP_ENTRY(value, name) \
  {value, std::to_string(val) + " - " + name}

STRING_MAP_ENTRY(0, "ENTRY_1")

Макрос должен превратить вышеуказанный вызов в {0, "0 - ENTRY_1"}

Есть ли способ сделать это? Моя текущая попытка такова:

#define STRING_MAP_ENTRY(val, name) \
  { val, std::to_string(val) + "(" + name + ")" }

Ответы [ 2 ]

5 голосов
/ 10 июля 2020

Что-то вроде этого может сработать:

#define STRING_MAP_ENTRY(value, name) \
  {value, #value " - " #name}

STRING_MAP_ENTRY(0, ENTRY_1)

# перед тем, как токен будет его строить. Что касается их объединения, соседние строковые литералы будут объединены в одну строку.

0 голосов
/ 11 июля 2020

Почему вы хотите использовать макрос?

Это не хорошо.

Используйте это:

auto STRING_MAP_ENTRY(int value_,string name_){
    struct{int value;string name;} pair_{value_,to_string(value_)+string(" - ")+name_};
    return pair_;
}

И используйте это, чтобы проверить, работает ли он:

auto aa= STRING_MAP_ENTRY(0,string("ENTRY_1"));
cout<<aa.value<<','<<aa.name<<endl; // 0,0 - ENTRY_1

Помните:

Всегда используйте ФУНКЦИЮ, а не МАКРОС !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...