Day 10.
Когда вы работаете с макросами, вам может пригодиться stringification operator.
#define STR(x) #x
Он позволяет превратить аргумент макроса в строку:
STR(123 foo real) // "123 foo real"
Причём аргумент в таком случае не expandится:
#define FOO 123
#define STR(x) #x
STR(FOO) // "FOO"
Если хотите раскрыть, нужен ещё один уровень:
#define STR2(x) #x
#define STR(x) STR2(x)
STR(FOO) // "123"
# почти сохраняет исходный текст (может поудалять лишние пробелы):
STR( a + b ) // "a + b"
Так что некоторые разные входные данные могут давать одинаковый результат. Надо быть осторожными.
Вы можете использовать
# для дебажных утилиток:
#define PRINT(expr) \
std::cout << #expr << " = " << (expr) << '\n';
PRINT(x + y) // x + y = 12
Эта же фича используется в
assert (вы видите упавшее условие в ошибке).@thisnotes. Patreon, Boosty.
Спасибо Artyom Garkavy и niki4smirn.