Nag*_*mya 6 c c++ string gcc widechar
我有UNICODE应用程序,我们在其中使用_T(x),其定义如下.
#if defined(_UNICODE)
#define _T(x) L ##x
#else
#define _T(x) x
#endif
Run Code Online (Sandbox Code Playgroud)
我知道L被定义为wchar_t,在任何平台上都是4个字节.如果我错了,请纠正我.我的要求是我需要L为2个字节.因此编译器hack我开始使用-fshort-wchar gcc标志.但现在我需要将我的应用程序移动到zSeries,我无法在该平台中看到-fshort-wchar标志的效果.
为了让我能够在zSeries上移植我的应用程序,我需要以这样的方式修改_T()宏,即使在使用L ## x并且不使用-fshort-wchar标志之后,我需要获得2byte宽字符data.Can有人告诉我如何更改L的定义,以便我可以在我的应用程序中将L定义为2个字节.
你不能 - 没有c ++ 0x支持.c ++ 0x定义了以下声明字符串文字的方法:
在广泛支持c ++ 0x之前,以跨平台方式对utf-16字符串进行编码的唯一方法是将其分解为位:
// make a char16_t type to stand in until msvc/gcc/etc supports
// c++0x utf string literals
#ifndef CHAR16_T_DEFINED
#define CHAR16_T_DEFINED
typedef unsigned short char16_t;
#endif
const char16_t strABC[] = { 'a', 'b', 'c', '\0' };
// the same declaration would work for a type that changes from 8 to 16 bits:
#ifdef _UNICODE
typedef char16_t TCHAR;
#else
typedef char TCHAR;
#endif
const TCHAR strABC2[] = { 'a', 'b', 'b', '\0' };
Run Code Online (Sandbox Code Playgroud)
_T宏只能在wchar_t为16位宽的平台上交付货物.并且,替代方案仍然不是真正的跨平台:char和wchar_t的编码是实现定义的,因此'a'不一定编码'a'(0x61)的unicode代码点.因此,要严格准确,这是编写字符串的唯一方法:
const TCHAR strABC[] = { '\x61', '\x62', '\x63', '\0' };
Run Code Online (Sandbox Code Playgroud)
这太可怕了.
| 归档时间: |
|
| 查看次数: |
17560 次 |
| 最近记录: |