如何在c++中使用宽字符串文字,而不将L放在每个文字的前面

How to use wide string literals in c++ without putting L in front of each one

本文关键字:文字 前面 c++ 字符串      更新时间:2023-10-16

你必须原谅我的无知,但我不习惯在c++中使用宽字符集,但有没有一种方法可以让我在c++中使用宽字符串文字,而不在每个文字前面放一个L?

如果是,如何?

不,没有。您必须使用L前缀(或一个宏,如带有VC++的_T(),在为Unicode编译时无论如何都会扩展为L)。

新的C++0x标准定义了另一种方法:
http://en.wikipedia.org/wiki/C%2B%2B0x#New_string_literals

相关注释。。我正在试着做下面的

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

这是一个宏,将扩展

get_switch(isrunning)

进入

myclass::getswitch(L"isrunning")

这在c++visualstudio2008中运行良好

但当我在macXcode(适用于iphone)下编译相同的代码时,我得到了错误:

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

EDIT:解决方案

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

这在vc++和mac-xcode(gcc)上都有效

为什么不想用L作为字符串文字的前缀?这很简单——没有L的字符串是ANSI字符串(const char*),有L的字符串则是宽字符串(const wchar_t*)。有一个TEXT()宏,它可以将字符串文字转换为ANSI或宽字符串,具体取决于当前项目的设置是否使用Uncode:


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

还有_T()宏,它相当于TEXT()