将字符串宏/常量转换为宽字符/ Unicode

时间:2011-07-12 18:58:38

标签: c++ unicode wchar c-preprocessor

我有一个Unicode Win32应用程序,它使用第三方库,其中一些提供的版本信息常量为#defined(narrow)字符串。例如,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 个答案:

答案 0 :(得分:5)

诀窍是使用两个宏。扩展宏时,参数在被替换到替换列表之前进行宏扩展。因此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)