Я использую этот препроцессора макрос «stringify» и легко вернуться из функции разрешающего определения:Stringify Macro с Unicode строковый литерал
#define STRINGIFY_RETURN(x) case x: return #x ""
Он работает как шарм в среде MBSC с нормальными строковых литералов. Пример:
#define MY_DEFINE_1 1
#define MY_DEFINE_2 2
#define MY_DEFINE_3 3
const char* GetMyDefineNameA(unsigned int value)
{
switch(value)
{
STRINGIFY_RETURN(MY_DEFINE_1);
STRINGIFY_RETURN(MY_DEFINE_2);
STRINGIFY_RETURN(MY_DEFINE_3);
default: return "Unknown";
}
}
Однако мне пришлось переключиться на совместимость Unicode все больше и больше и поэтому мне пришлось переписать эту функцию, чтобы возвращать строки Unicode, которые требуют префиксов с L
перед строковых литералов. Так что я пробовал:
#define STRINGIFY_RETURN_WIDE(x) case x: return #x L""
const wchar_t* GetMyDefineNameW(unsigned int value)
{
switch(value)
{
STRINGIFY_RETURN_WIDE(MY_DEFINE_1);
STRINGIFY_RETURN_WIDE(MY_DEFINE_2);
STRINGIFY_RETURN_WIDE(MY_DEFINE_3);
default: return L"Unknown";
}
}
Но это дает мне ошибки:
ошибка C2308: конкатенация несовпадающие строки
ошибка C2440: 'возвращение': не удается преобразовать из «сопзЬ гольца [12] 'до' сопзЬ wchar_t *
Я также попытался:
#define STRINGIFY_RETURN_WIDE(x) case x: return L #x ""
#define STRINGIFY_RETURN_WIDE(x) case x: return #x "" L
но несмотря ни на что, я не могу заставить его работать. Я не знаю об этом и не могу найти решение.
Я был бы очень благодарен, если бы кто-то мог показать правильный способ сделать этот макрос, чтобы он разрешил строковый литерал в Юникоде.
Update:
#define STRINGIFY_RETURN_WIDE(x) case x: return L#x ""
не бросает ошибку C2440, но она по-прежнему дает мне C2308.
Update 2:
Я использую Microsoft Visual Studio 2013
Вы должны распечатать предварительно обработанный файл, чтобы посмотреть, что именно производится компилятором, а затем работать оттуда. – PaulMcKenzie
бы вы не просто хотите: #define STRINGIFY_RETURN_WIDE (х) Случай х: возвращение L # х «» –
@TimBeaudet Я просто попытался, это дает мне C2308 как хорошо, но ошибка C2440 ушла:/ – Vinzenz