“Uint32”,“int16”之类;他们是标准的c ++吗?

时间:2009-05-26 14:35:44

标签: c++

我对c ++很陌生,但我已经掌握了基础知识。我在阅读其他代码时遇到了“Uint32”(各种大写)和类似数据类型的使用,但我找不到任何提及它们的文档。我知道“Uint32”是一个32位无符号整数,但我的编译器没有。我正在使用visual c ++ express,它无法从我所知道的任何形式识别它。

是否有一些编译器默认读取这些数据类型,或者让这些程序员将它们自己声明为类或#define常量?

我可以看到使用它们确切知道整数的长度,因为正常的声明似乎因系统而异。使用它们还有其他优点或缺点吗?

6 个答案:

答案 0 :(得分:19)

Unix平台在 stdint.h 中定义这些类型,这是在编写可移植代码时确保类型大小调整的首选方法。

Microsoft的平台没有定义此标头,这在跨平台时是一个问题。如果您还没有使用Boost Integer Library,我建议让Paul Hsieh portable stdint.h实现此标头,以便在Microsoft平台上使用。

更新:Visual Studio 2010及更高版本会定义此标头。

答案 1 :(得分:13)

C99头文件stdint.h定义了uint32_t形式的这种性质的typedef。据我所知,标准C ++不提供命名空间std中的符号的cstdint版本,但是有些编译器可能,并且您通常能够包含来自C ++代码的C99头。下一版本的C ++将提供cstdint标头。

您经常会看到使用此主题的非标准形式的其他人的代码,例如Uint32_tUint32uint32等。他们通常只提供一个标题,在项目中定义这些类型。可能这段代码最初是很久以前开发的,当C99编译器变得普遍时,他们从不打扰用sed取代定义。

答案 2 :(得分:12)

Visual c ++不支持固定宽度整数类型,因为它不包括对C99的支持。查看my question on this subject的答案,了解使用它们的各种选项。

答案 3 :(得分:3)

使用它们的主要原因是您不必担心在64位和32位操作系统之间切换时可能出现的任何问题。

此外,如果您正在连接任何遗留代码,而新代码的目标是32位甚至16位,那么它也可以避免潜在的问题。

答案 4 :(得分:1)

尝试使用UINT32 for Microsoft。

大写清楚地表明这被定义为宏。如果您尝试使用不包含宏的其他编译器进行编译,您可以自己定义它,并且您的代码不必更改。

答案 5 :(得分:1)

uint32 等人由宏定义。它们解决了一个历史性的可移植性问题,即跨平台的保证很少(当有比现在更多的平台选项时),当你要求int或short时,你会得到多少比特。 (一个现在已经不存在的C编译为Mac提供了8位短路!)。