我想要固定宽度类型,包括字符类型。 <stdint.h>
提供整数的类型,但不提供字符,除非使用C ++ 11,我无法做到。
是否有一种干净的方法来定义这些类型(char16_t
,char32_t
等),而不会与C ++ 11定义的类型冲突,以防源与C ++ 11混合使用?
谢谢:)
答案 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 types(this great page)。