你必须原谅我的无知,但我不习惯在C++中使用宽字符集,但有没有办法让我可以在C++中使用宽字符串文字而不在每个文字前加上L?如何在C++中使用宽字符串文字而不需要将L放在每个文件的前面
如果是这样,怎么样?
你必须原谅我的无知,但我不习惯在C++中使用宽字符集,但有没有办法让我可以在C++中使用宽字符串文字而不在每个文字前加上L?如何在C++中使用宽字符串文字而不需要将L放在每个文件的前面
如果是这样,怎么样?
不,没有。您必须使用L前缀(或VC++中的_T()这样的宏,当编译为Unicode时,无论如何扩展到L)。
为什么你不想在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()
。
新的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++中的VisualStudio 2008
,但是当我在Mac的Xcode(iPhone版)编译相同的代码我得到的错误:
error: 'L' was not defined in this scope.
编辑:解
#define get_switch(m) myclass::getSwitch(L ## #m)
这适用于vC++和mac xcode(gcc)
这并不完全准确。 _T()宏只在你定义的UNICODE中扩展为L。这实质上是将其作为宏观的一点。如果您希望字符串始终为unicode,请直接使用L。 – shoosh 2008-11-03 22:37:03