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

时间:2015-04-29 13:28:41

标签: c++ c++11

我想要固定宽度类型,包括字符类型。 <stdint.h>提供整数的类型,但不提供字符,除非使用C ++ 11,我无法做到。

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

谢谢:)

1 个答案:

答案 0 :(得分:7)

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

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

  

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

但是,您可以检查C ++ 11支持。根据{{​​3}}页面:

  

<强> __ 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

如何定义自己的?

- &gt; MSVC,Windows上的ICC:使用Bjarne Stroustrup's,VS .NET 2003及更高版本支持:

typedef __int16 int16_t;
typedef unsigned __int16 uint16_t;
typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;

- &gt; GCC,MinGW,Linux上的ICC:这些都有完整的C99支持,因此请使用<cstdint>中的类型而不是typedef您自己的类型(您可能)想要检查版本或特定于编译器的宏。)

然后:

typedef int16_t char16_t;
typedef uint16_t uchar16_t;
typedef int32_t char32_t;
typedef uint32_t uchar32_t;

如何检查正在使用的编译器?使用platform-specific typesthis great page)。