Pracuję nad projektem, gdzie mam wielu stałych ciągów utworzone przez łączenie (numery, etc.).Jak przekonwertować konkatenowanych struny do szerokiego char z C preprocesora?
Na przykład, mam LOCATION
makro, które formatuje __FILE__
i __LINE__
na ciąg znaków, które można wykorzystać, aby wiedzieć, gdzie jestem w kodzie, podczas drukowania wiadomości lub błędy:
#define _STR(x) # x
#define STR(x) _STR(x)
#define LOCATION __FILE__ "(" STR(__LINE__) ")"
Tak, to byłoby sformatuj lokalizację taką jak "file.cpp (42)". Problem jest, gdy próbuję przekonwertować wynik do szerokiej-string:
#define _WIDEN(x) L ## x
#define WIDEN(x) _WIDEN(x)
#define WLOCATION WIDEN(LOCATION)
Działa to dobrze z GCC, a wyniki w L „file.cpp (42)” jest włożona w moim kodu. Jednak gdy próbuje to z MSVC++ (przy użyciu Visual C++ 2008 Express), pojawia się błąd:
error: Concatenating wide "file.cpp" with narrow "("
Rozumiem, że przedrostek L
zostanie dodany tylko do pierwszego terminu w mojej wypowiedzi. Próbowałem już też to:
#define _WIDEN(x) L ## #x
, która „działa”, ale daje ciąg L"\"file.cpp\" \"(\" \"42\" \")\""
co nie jest oczywiście bardzo wygodne (a nie to, czego szukam), zwłaszcza biorąc pod uwagę, że to makro jest prosty w porównaniu do innych makra.
Więc moje pytanie brzmi: w jaki sposób mogę je zastosować do całego wyrażenia w MSVC++, więc mogę uzyskać ten sam wynik otrzymuję z GCC? I raczej nie utworzyć drugi ciąg z szerokimi wszystkie żetony, bo będę wtedy musiał utrzymać dwa makra dla każdego z nich, które nie jest bardzo wygodne i może prowadzić do błędów. Dodatkowo, potrzebuję wąskiej wersji każdego łańcucha, więc używanie nieskończonych łańcuchów niestety nie jest opcją.
To działa, mimo że jest to rodzaj niezręcznej składni i ma dużo narzutów ... ale działa i nie muszę utrzymywać wielu makr. Mam nadzieję, że Microsoft zaktualizuje swój preprocesor, aby obsługiwał więcej funkcji C99, w ten sposób byłoby znacznie łatwiej. Dzięki! –