2008-11-03 60 views

回答

25

不,没有。您必须使用L前缀(或VC++中的_T()这样的宏,当编译为Unicode时,无论如何扩展到L)。

+6

这并不完全准确。 _T()宏只在你定义的UNICODE中扩展为L。这实质上是将其作为宏观的一点。如果您希望字符串始终为unicode,请直接使用L。 – shoosh 2008-11-03 22:37:03

1

为什么你不想在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()

+0

我们正在阅读文件可能是unicode并输出unicode xml,因此我们在内部进行的转换映射将wstring与我们的字符串文字进行比较。 – Fry 2008-11-03 22:10:42

+0

@ Adam - 只是好奇 - 你知道_T和TEXT宏是否是语言标准的一部分,还是他们是MS VC++特定的? – 2008-11-04 02:12:10

+0

它在WinNT.h中(包含在windows.h中)。我不认为它是特定于VC++的,而是特定于Windows的,因为它可以在任何可以让你构建WinAPI应用程序的设置中使用。 – KTC 2008-11-04 06:48:31

3

在一个相关的说明.. 我试图做到以下几点

#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)

相关问题