3

是否有一个标准宏可以使用 Visual Studio 2005 将用预处理器宏替换的 char 字符串文字转换为 wchar_t 字符串?

例如这有效:

wchar_t* test = L"Hello World";

但这不是:

#define HELLOWORLD "Hello World"
wchar_t* test = L(HELLOWORLD);

我正在与不同平台上的几个不同项目共享一个包含许多国际化字符串的头文件,因此我不想更改标头本身,也不想添加 _T() 因为这取决于平台。所以我希望 unicode 转换在我的源代码中,而不是在标题中。我知道我可以编写自己的替换宏,如此处所示但我想知道 VS 中是否有标准方法?

对于任何编写国际化代码的人来说,这似乎是一个非常常见的场景,但我似乎找不到随 VS2005 提供的预定义宏。

4

2 回答 2

1

我有一个类似的问题,我想出了这个解决方案:

#define HELLOWORLD "Hello World"
const wchar_t* test = L"" HELLOWORLD;

我用 GCC 7 对此进行了测试,我必须确保转换(宽到字符)功能正常工作。

我很确定这也适用于其他编译器。即使是较旧的,也需要编写多行注释的功能。但也许它会抱怨使用空字符串文字。

于 2019-09-19T10:13:11.080 回答
0

不,没有“标准”宏。标准是在宽字符串前加上 anL前缀,并在窄字符串中省略前缀。

甚至需要存在这样的宏的唯一原因是当您针对不支持 Unicode 的平台进行各种定位时。在这种情况下,一切都需要是一个窄字符串。如果您不是在处理缺乏 Unicode 支持的平台,那么所有内容都可能一直是一个宽字符串。

在Windows 头文件中提供了_TTEXT宏正是为了这个目的:维护一个单一的代码库,可以为支持 Unicode 的 Windows NT 和缺乏 Unicode 支持的 Windows 9x 编译。

我无法想象如果您还没有包含 Windows 标头,为什么您需要这样的宏,但是如果您这样做了,那么您自己编写一个非常简单。除了您需要知道字符串文字何时应该是宽字符串以及何时应该是窄字符串之外。这也没有“标准” #define。Windows 标头使用UNICODE预处理器符号,但您不能依赖它在其他平台上定义。所以现在你回到了你开始的地方。

为什么你认为你需要一个宏呢?如果您将字符串的类型硬编码为wchar_t*,那么您总是希望使用宽字符文字,因此您总是希望使用L前缀。

当您使用 Windows 标头中的_T和/或TEXT宏时,您也没有将字符串的类型硬编码为wchar_t*. 相反,您使用的是TCHAR宏,它会根据符号的定义自动解析为适当的字符类型UNICODE

于 2012-08-09T02:16:26.110 回答