你必須原諒我的無知,但我不習慣在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