C++ wchar\t与GCC有多大?

C++ wchar\t与GCC有多大?,c++,gcc,macros,C++,Gcc,Macros,GCC支持-fshort-wchar,它将wchar\u t从4字节切换到2字节 在编译时检测wchar\u t大小的最佳方法是什么,以便我可以将其正确映射到适当的utf-16或utf-32类型? 至少,直到c++0x被释放并为我们提供稳定的utf16和utf-32类型定义 #if ?what_goes_here? typedef wchar_t Utf32; typedef unsigned short Utf16; #else typedef wchar_t Utf16; t

GCC支持-fshort-wchar,它将wchar\u t从4字节切换到2字节

在编译时检测wchar\u t大小的最佳方法是什么,以便我可以将其正确映射到适当的utf-16或utf-32类型? 至少,直到c++0x被释放并为我们提供稳定的utf16和utf-32类型定义

#if ?what_goes_here?
  typedef wchar_t Utf32;
  typedef unsigned short Utf16;
#else
  typedef wchar_t Utf16;
  typedef unsigned int Utf32;
#endif
模板
结构废话;
模板
结构废话{
typedef wchar_t Utf32;
typedef无符号短Utf16;
};
模板
结构废话{
类型定义wchar_t Utf16;
typedef无符号整数Utf32;
};
typedef blah::Utf16 Utf16;
typedef blah::Utf32 Utf32;
您可以使用宏

__WCHAR_MAX__
__WCHAR_TYPE__
它们由gcc定义。您可以使用
echo”“|gcc-E--dM检查它们的值

由于
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu类型的值可以从
int
short unsigned int
long int
不等,因此,最好的测试方法是

#if __WCHAR_MAX__ > 0x10000
  typedef ...
#endif

正如路德·布利塞特(Luther Blissett)所说,wchar\u t独立于Unicode而存在——它们是两个不同的东西


如果您真的在谈论UTF-16-请注意,有一些unicode字符映射到两个16位字(U+10000..U+10FFFF,尽管这些在西方国家/语言中很少使用)。

您可以使用标准宏:
WCHAR\U MAX

#include <wchar.h>
#if WCHAR_MAX > 0xFFFFu
// ...
#endif
#包括
#如果WCHAR_MAX>0xFFFFu
// ...
#恩迪夫

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

大小取决于编译器标志-fshort wchar:

$ g++ -E -dD -xc++ /dev/null | grep WCHAR
#define __WCHAR_TYPE__ int
#define __WCHAR_MAX__ 2147483647
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __SIZEOF_WCHAR_T__ 4
g++ -E -dD -fshort-wchar -xc++ /dev/null | grep WCHAR
#define __WCHAR_TYPE__ short unsigned int
#define __WCHAR_MAX__ 0xffff
#define __WCHAR_MIN__ 0
#define __WCHAR_UNSIGNED__ 1
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __SIZEOF_WCHAR_T__ 2
#define __ARM_SIZEOF_WCHAR_T 4

为什么您会假设一个无符号的short是2个字节宽,而一个无符号的int是4个字节,而不是简单地无条件地定义它们?你在半心半意地使用你的假设…@etarion:我只是简单地回答了这个问题。WCARGHT是C++中的一种不同类型(我不能回忆C),OP(显然)想要使用它。这是使用C++来避免“γIFF”魔法的一种非常巧妙的方法。也就是说,它确实污染了全局名称空间。@ChrisBecke:您可以将blah(或utf_types:P)放在“detail”名称空间中,类似于Boost隐藏实现细节的方式。希望整个过程(包括最后的Utf16/32 typedef)也被包装在项目的名称空间中。wchar\u t与unicode无关。它是一种独特的类型,可以容纳所有支持的区域设置中最大扩展字符集的所有成员。如果您的平台只支持ASCII,那么sizeof(wchar_t)可以是1。这也意味着,例如,L'mötley crüe'不一定是unicode字符串——它也可以是存储在wchar_____________________________________。基于这个建议,在C++0x被普遍发布之前,我们不应该尝试处理Utf编码的字符串。同时,我需要一套TypeDef,用于我支持的平台,它映射到最合适的不同类型,可以保存所需的数据。我将此标记为答案,因为它最接近我所寻找的。另一个答案中的模板魔术似乎是一种更聪明的方法,可以支持更多平台,而不需要知道许多特定于平台的宏。如果ISO标准中定义了WCHAR_MAX,那么您可以在所有编译器上安全地使用它(因为任何不定义代码> WCARXMAX ,在技术上既不是C也不是C++编译器)。
g++ -E -dD -fshort-wchar -xc++ /dev/null | grep WCHAR
#define __WCHAR_TYPE__ short unsigned int
#define __WCHAR_MAX__ 0xffff
#define __WCHAR_MIN__ 0
#define __WCHAR_UNSIGNED__ 1
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __SIZEOF_WCHAR_T__ 2
#define __ARM_SIZEOF_WCHAR_T 4