在没有C++ 11的情况下使用char16_t,char32_t等?

Vir*_*721 4 c++ c++11

我想有固定的宽度类型,包括字符类型.<stdint.h>提供整数的类型,但不提供字符,除非使用C++ 11,我不能这样做.

有没有一种干净的方法来定义这些类型(char16_t,char32_t等),而不会与C++ 11 定义的类型冲突,以防源与C++ 11混合?

谢谢 :)

Mat*_*jek 7

我认为,检查这些类型是否受支持是依赖于平台的事情.例如,GCC定义:__CHAR16_TYPE__以及__CHAR32_TYPE__是否提供了这些类型(需要ISO C11或C++ 11支持).

但是,您无法直接检查它们的存在,因为它们是基本类型,而不是宏:

在C++中,char16_t和char32_t是基本类型(因此这个头文件在C++中没有定义这样的宏).

但是,您可以检查C++ 11支持.根据Bjarne Stroustrup的网页:

__cplusplus

在C++ 11中,宏__cplusplus将被设置为与当前199711L不同(大于)的值.

所以,基本上,你可以这样做:

#if __cplusplus > 199711L
// Has C++ 11, so we can assume presence of `char16_t` and `char32_t`
#else
// No C++ 11 support, define our own
#endif
Run Code Online (Sandbox Code Playgroud)

如何定义自己的?

- > Windows上的MSVC,ICC:使用VS .NET 2003及更新版本支持的特定平台的类型:

typedef __int16 int16_t;
typedef unsigned __int16 uint16_t;
typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;
Run Code Online (Sandbox Code Playgroud)

- > Linux上的GCC,MinGW,ICC:这些都有完整的C99支持,因此使用来自<cstdint>和不属于typedef您自己的类型(您可能需要检查版本或特定于编译器的宏).

然后:

typedef int16_t char16_t;
typedef uint16_t uchar16_t;
typedef int32_t char32_t;
typedef uint32_t uchar32_t;
Run Code Online (Sandbox Code Playgroud)

如何检查正在使用的编译器?使用这个伟大的页面('编译器'部分).