用于在VC ++中将字符串文字提升为wchar_t的标准宏

时间:2012-08-09 02:03:12

标签: visual-c++ visual-studio-2005

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

e.g。这有效:

wchar_t* test = L"Hello World";

但这并不是:

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

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

对于编写国际化代码的人来说,这似乎是一种非常常见的情况,但我似乎无法找到VS2005提供的预定义宏。

2 个答案:

答案 0 :(得分:1)

不,没有“标准”宏。标准是使用L为宽字符串添加前缀,并省略窄字符串中的前缀。

这种宏甚至需要存在的唯一原因是当你不同地瞄准不支持Unicode的平台时。在这种情况下,一切都需要是一个狭窄的字符串。如果您没有处理缺乏Unicode支持的平台,那么所有应该始终是一个宽字符串。

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

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

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

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

答案 1 :(得分:0)

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

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

我在GCC 7上对此进行了测试,在这里我必须确保转换(从宽到字符)功能可以正常工作。

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