与GCC wchar_t有多大?

Chr*_*cke 13 c++ macros gcc

GCC支持-fshort-wchar,它将wchar_t从4切换到两个字节.

在编译时检测wchar_t大小的最佳方法是什么,所以我可以正确映射到适当的utf-16或utf-32类型?至少,直到c ++ 0x被释放并给我们稳定的utf16_t和utf_32_t typedef.

#if ?what_goes_here?
  typedef wchar_t Utf32;
  typedef unsigned short Utf16;
#else
  typedef wchar_t Utf16;
  typedef unsigned int Utf32;
#endif
Run Code Online (Sandbox Code Playgroud)

Did*_*set 14

您可以使用宏

__WCHAR_MAX__
__WCHAR_TYPE__
Run Code Online (Sandbox Code Playgroud)

它们由gcc定义.你可以用它来检查它们的价值echo "" | gcc -E - -dM

As的值__WCHAR_TYPE__可以从变化intshort unsigned intlong int,最好为您的测试是IMHO,以检查是否__WCHAR_MAX__是上述2 ^ 16.

#if __WCHAR_MAX__ > 0x10000
  typedef ...
#endif
Run Code Online (Sandbox Code Playgroud)


Fre*_*urk 12

template<int>
struct blah;

template<>
struct blah<4> {
  typedef wchar_t Utf32;
  typedef unsigned short Utf16;
};

template<>
struct blah<2> {
  typedef wchar_t Utf16;
  typedef unsigned int Utf32;
};

typedef blah<sizeof(wchar_t)>::Utf16 Utf16;
typedef blah<sizeof(wchar_t)>::Utf32 Utf32;
Run Code Online (Sandbox Code Playgroud)

  • @ChrisBecke:您可以将blah(或utf_types:P)放在"详细信息"命名空间中,类似于Boost隐藏实现细节的方式.希望整个事情(包括最后的Utf16/32 typedef)也包含在项目的命名空间中. (3认同)
  • +1。我称它为`struct utf_types` :) (2认同)

ASB*_*Bai 5

您可以使用标准宏WCHAR_MAX

#include <wchar.h>
#if WCHAR_MAX > 0xFFFFu
// ...
#endif
Run Code Online (Sandbox Code Playgroud)

WCHAR_MAX宏是由ISO CISO C ++标准定义的(请参阅:ISO / IEC 9899-7.18.3其他整数类型的限制以及ISO / IEC 14882-C.2),因此您可以在几乎所有编译器上安全地使用它。