Как подсунуть значение энама (число) в виде строки в другую строку в compile time

так работает:

#define SMTH "smth"
const char* const str = "\"" SMTH  "\""; // будет "smth"

как сделать так:

enum {number = 1};
const char* const str = "\"" number "\""; // нужно "1", но такой синтаксис не поддерживается

Ответы (2 шт):

Автор решения: Erebus

Возможно, что-то наподобие такого?

enum {number = 1};
const std::string value = std::to_string(number);
const char* str = value.c_str() ;
→ Ссылка
Автор решения: avp

С 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))`
→ Ссылка