Иногда необходимо создать строковые литералы с одинаковым значением для типов char *
и wchar_t *
(например, при разработке в Windows). Простой способ - написать определение дважды:
const char *my_string = "Hello World";
const wchar_t *my_wide_string = L"Hello World";
Проблема в том, что если нам нужно изменить строку, а не просто поменять одно место, необходимо обновить обе строки, что часто приводит к опечаткам и ошибкам. В идеале литерал должен появляться только один раз, и обе переменные заполняются из него.
Мы могли бы определить переменную char
и преобразовать ее в версию wchar_t
во время выполнения. Однако лучше избегать затрат времени выполнения, так как литерал уже доступен во время компиляции.
Я думал использовать оператор вставки токена, но не могу заставить его работать, потому что он принимает только другой строковый литерал:
#define my_string "Hello World"
#define make_wide(str) L##str
#define my_wide_string make_wide(my_string) // expand to Lmy_string instead of L"Hello World"
Я не уверен, можно ли использовать constexpr
, чтобы заставить его работать?