如何在C++中使用宽字符串字面量而无需在每个字符串前面加上L

15

请原谅我的无知,我不习惯在c++中使用宽字符集,但是是否有一种方法可以在c++中使用宽字符串字面值而不必在每个字面值前面添加L呢?

如果有的话,该怎么做呢?


14年后,这似乎仍然是一个问题... - Andrew
4个回答

25

没有,你必须使用L前缀(或者在使用VC++时使用_T()宏,在编译为Unicode时会自动展开为L)。


6
这并不完全准确。如果你定义了UNICODE,_T()宏仅会扩展为L。这实质上是将其作为宏存在的原因。如果您想使字符串始终为Unicode,请直接使用L。 - shoosh

18

1
是的,但这仍然需要一个前缀。顺便说一句,我仍然投了你一票,因为这是准确的建议。 - Max Lybbert

3

顺便提一下.. 我正在尝试做以下事情

#define  get_switch( m )   myclass::getSwitch(L##m)

这是一个宏,将会被扩展。

get_switch(isrunning)

转化为

myclass::getswitch(L"isrunning")

这段代码在 C++ Visual Studio 2008 中可以正常运行。

但是当我在 Mac Xcode(用于 iPhone)下编译相同的代码时,会出现以下错误:

error: 'L' was not defined in this scope.

编辑:解决方案

#define  get_switch( m )   myclass::getSwitch(L ## #m)

这适用于VC++和Mac Xcode(GCC)。


1
那不应该是 #define get_switch( m ) myclass::getSwitch(L ## #m) 吗? - D.Shawley
谢谢,确实有效。我已经用myclass::getSwitch(L"" #m)让它工作了。 - ShoeLace

1
为什么你不想在字符串字面值前加上 L 呢?这很简单 - 没有 L 的字符串是 ANSI 字符串(const char*),带有 L 的字符串是宽字符字符串(const wchar_t*)。有一个 TEXT() 宏,可以根据当前项目是否设置为使用 Unicode 将字符串字面值转换为 ANSI 或宽字符字符串:

#ifdef UNICODE
#define TEXT(s) L ## s
#else
#define TEXT(s) s
#endif

还有_T()宏,它等同于TEXT()


我们正在读取可能是Unicode格式的文件,并输出Unicode XML,因此我们在内部进行的转换映射将wstring与我们的字符串字面量进行比较。 - Fry
@Adam - 只是好奇 - 你知道 _T 和 TEXT 宏是否是语言标准的一部分,还是仅限于 MS VC++ 吗? - Onorio Catenacci
它在WinNT.h中(从windows.h包含)。我不认为它是VC++特定的,而是Windows特定的,因为它将在任何允许您构建WinAPI应用程序的设置中可用。 - KTC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接