używam tego makra preprocesora do „stringify” i wrócić łatwo z funkcją rozdzielczą definicji:stringify Makro z Unicode String Dosłowne
#define STRINGIFY_RETURN(x) case x: return #x ""
To działa jak czar w środowisku MBSC z normalnymi napisowych. Przykład:
#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";
}
}
Jednak musiałem przełączyć się do kompatybilności Unicode coraz więcej i tak musiałem przepisać tej funkcji, aby wrócić ciągi Unicode, które wymagają poprzedzanie z L
z przodu napisowych. Tak próbowałem:
#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";
}
}
Ale to daje mi błędy:
error C2308: Połączenie niedopasowane strings
error C2440: 'return': nie można przekonwertować z „const char [12] 'do' const wchar_t *
próbowałem również:
#define STRINGIFY_RETURN_WIDE(x) case x: return L #x ""
#define STRINGIFY_RETURN_WIDE(x) case x: return #x "" L
ale nie ważne co, nie mogę go uruchomić. Nie mam pojęcia o tym i nie mogę znaleźć rozwiązania.
Byłbym naprawdę wdzięczny, gdyby ktoś mógł pokazać prawidłowy sposób wykonania tego makra, aby mógł zostać rozwiązany na literał ciągu znaków Unicode.
Aktualizacja:
#define STRINGIFY_RETURN_WIDE(x) case x: return L#x ""
nie rzucać się błąd C2440, ale wciąż daje mi C2308.
Aktualizacja 2:
Używam Microsoft Visual Studio 2013
Powinieneś wydrukować wstępnie przetworzony plik, aby zobaczyć dokładnie, co wyprodukował kompilator, a następnie pracować z tego miejsca. – PaulMcKenzie
Czy nie chcesz po prostu: #define STRINGIFY_RETURN_WIDE (x) x przypadek: powrót l # x „” –
@TimBeaudet Właśnie próbował, to daje mi C2308 oraz C2440 ale błąd nie ma:/ – Vinzenz