gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:45 24 4
gpt4 key购买 nike

我有一个使用第 3 方库的 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"

我将各种静态链接的库版本信息附加到我的关于框以便于版本跟踪,并且将此常量转换为宽字符串似乎很简单。

我的第一次尝试是 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"并且必须使其与第 3 方库保持同步。

我知道如果我正在为 Unicode 构建,我可以在运行时转换它,但我认为肯定有一种快速的方法来重新定义这个常量。

---更新---

我用我的包含结构做了一些非常愚蠢的事情,从而错过了情节。修复允许双定义包装器正常运行的问题。愚蠢的我。

最佳答案

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

关于c++ - 将字符串宏/常量转换为宽字符/Unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6669551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com