Преобразование строковых макросов / констант в широкие символы / Unicode - PullRequest
5 голосов
/ 12 июля 2011

У меня есть приложение Unicode Win32, которое использует сторонние библиотеки, некоторые из которых предоставляют константы для информации о своих версиях в виде #defined (узких) строк. Например, libpng имеет следующее:

#define PNG_LIBPNG_VER_STRING "1.5.4"
#define PNG_HEADER_VERSION_STRING \
 " libpng version 1.5.4 - July 7, 2011\n"

Я добавляю информацию о версии связанных библиотек статически в мой About Box для легкого отслеживания версий, и казалось, что будет просто преобразовать эту константу в широкую строку.

Моей первой попыткой был TEXT (PNG_HEADER_VERSION_STRING), но она не удалась как

#define __TEXT(quote) L##quote

.. и LPNGHEADER_VERSION_STRING, конечно, не существует.

Итак, я попробовал несколько комбинаций макросов двойной обертки и всевозможных трюков ##, чтобы попытаться добавить префикс L к константе макроса, но не смог. Я что-то упустил? Как бы вы справились:

#define VERSIONSTR "Test V1.2.3"
const char* ver= VERSIONSTR;
const wchar* wver = _T(VERSIONSTR); // fails, should be L"Test V1.2.3"
#define VERSIONSTRW _T(VERSIONSTR);  // fails also

программно, без простого добавления дубликата L "Test V1.2.3" и необходимости его синхронизации с сторонней библиотекой.

Я знаю, что могу просто преобразовать его во время выполнения, если я создаю для Unicode, но я, конечно, подумал, что есть быстрый способ переопределить эту константу.

--- UPDATE ---

Я пропустил сюжет, делая что-то действительно глупое с моей структурой включения. Исправление, которое позволило оболочке с двойным определением функционировать так, как должно. Глупо с моей стороны.

1 Ответ

5 голосов
/ 12 июля 2011

Хитрость в том, чтобы использовать два макроса. Когда макрос раскрывается, аргументы расширяются до добавления в список замены. Так что WIDEN(VERSIONSTR) становится WIDEN2("Test V1.2.3").

#define WIDEN(quote) WIDEN2(quote)
#define WIDEN2(quote) L##quote

#define VERSIONSTR "Test V1.2.3"
#define VERSIONSTRW WIDEN(VERSIONSTR)
...