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__可以从变化int到short unsigned int或long 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)
您可以使用标准宏WCHAR_MAX:
#include <wchar.h>
#if WCHAR_MAX > 0xFFFFu
// ...
#endif
Run Code Online (Sandbox Code Playgroud)
WCHAR_MAX宏是由ISO C和 ISO C ++标准定义的(请参阅:ISO / IEC 9899-7.18.3其他整数类型的限制以及ISO / IEC 14882-C.2),因此您可以在几乎所有编译器上安全地使用它。