Как подсунуть значение энама (число) в виде строки в другую строку в compile time
так работает:
#define SMTH "smth"
const char* const str = "\"" SMTH "\""; // будет "smth"
как сделать так:
enum {number = 1};
const char* const str = "\"" number "\""; // нужно "1", но такой синтаксис не поддерживается
Ответы (2 шт):
Возможно, что-то наподобие такого?
enum {number = 1};
const std::string value = std::to_string(number);
const char* str = value.c_str() ;
С enum-ом (а также с любой инициализируемой переменной) не получится, поскольку текстовые подстановки проводятся препроцессором, т.е. на шаге предшествующем собственно компиляции.
С помощью директив препроцессора #define можно заключить в кавычки значение другого макроса (т.е. имени, определенного в #define) следующим образом:
#define STR(x) #x
#define XSTR(x) STR(x)
Здесь STR(x) заключает в кавычки свой аргумент (т.е. тот текст, который мы размещаем в скобках),
а XSTR(x) передает в качестве аргумента в STR x с уже сделанными подстановками (раскрытием макросов).
Тогда, если мы определим макрос
#define N 222
то можем подставить в текст программы значение N в кавычках:
const char *t = XSTR(N);
получая после препроцессора:
const char *t = "222";
(это можно увидеть, запустив компилятор с ключем -E (например g++ -E t.cpp))
Стоит заметить, что макрос XSTR() создает строки в том числе и из содержимого других макросов с аргументами. Например, код:
#define YNX(x) ({if ((x) > 0) cout << "Yes"; else cout << "No";})
....
cout << "XSTR(YNX(N)) = `"<< XSTR(YNX(N)) << "`\n";
cout << "STR(XSTR(YNX(N))) = `" << STR(XSTR(YNX(N))) << "`\n";
напечатает при выполнении программы
XSTR(YNX(N)) = `({if ((222) > 0) cout << "Yes"; else cout << "No";})`
STR(XSTR(YNX(N))) = `XSTR(YNX(N))`