“Uint32”、“int16”等;它们是标准的 C++ 吗?
Posted
技术标签:
【中文标题】“Uint32”、“int16”等;它们是标准的 C++ 吗?【英文标题】:"Uint32", "int16" and the like; are they standard c++? 【发布时间】:2009-05-26 14:35:43 【问题描述】:我对 c++ 还很陌生,但我已经掌握了基础知识。我在阅读其他人的代码时遇到了“Uint32”(各种大写形式)和类似数据类型的使用,但我找不到任何提及它们的文档。我知道“Uint32”是一个 32 位的无符号整数,但我的编译器没有。我正在使用visual c++ express,它无法识别任何形式的它。
是否有一些编译器默认读取这些数据类型,或者这些程序员将它们自己声明为类或#define 常量?
我可以看到使用它们来准确了解整数的长度,因为正常声明似乎因系统而异。使用它们还有其他优点或缺点吗?
【问题讨论】:
【参考方案1】:Unix 平台在 stdint.h 中定义这些类型,这是编写可移植代码时确保类型大小的首选方法。
微软的平台没有定义这个header,跨平台的时候会出现问题。如果您还没有使用 Boost Integer Library,我建议您使用 Paul Hsieh 的 portable stdint.h 实现此标头以在 Microsoft 平台上使用。
更新: Visual Studio 2010 及更高版本确实定义了此标头。
【讨论】:
【参考方案2】:C99 头文件 stdint.h 定义了 uint32_t
形式的这种性质的 typedef。据我所知,标准 C++ 没有提供带有命名空间 std 中符号的 cstdint 版本,但某些编译器可能会,而且您通常可以从 C++ 代码中包含 C99 标头。下一版本的 C++ 将提供 cstdint 标头。
您经常会看到使用此主题的非标准形式的其他人的代码,例如 Uint32_t
或 Uint32
或 uint32
等。他们通常只提供一个在项目中定义这些类型的标头.可能这段代码最初是很久以前开发的,当 C99 编译器变得普遍时,他们从不费心用 sed 替换定义。
【讨论】:
尤其是因为 MSVC 似乎并不热衷于这些类型:D【参考方案3】:Visual c++ 不支持固定宽度整数类型,因为它不支持 C99。查看my question on this subject 的答案,了解您使用它们的各种选项。
【讨论】:
非常好。我想我会使用 boost 库,因为它是跨平台的。该死的微软和他们自己动手的原则。 微软并不是真正的罪魁祸首:他们严格遵守标准:C++ 还没有任何标准化的固定大小数字类型。 我也使用 boost 类型。 Microsoft 最终将支持这些类型,因为它们将成为 C++ 标准的一部分。 好吧,我确实责怪微软不支持 C99。里面有我想要的东西。其中大部分已经以 Microsoft 专有的方式实现,但有些还没有实现,无论如何,所有#ifdef
语句都会使我的代码变得不必要。【参考方案4】:
使用它们的主要原因是您不必担心在 64 位和 32 位操作系统之间切换时可能出现的任何问题。
此外,如果您要连接任何新的用于 32 位甚至 16 位的旧代码,那么它也可以避免潜在的问题。
【讨论】:
我确信在处理跨平台项目时要牢记这一点。 在实现分布式应用程序时,它们也非常有用,因为在客户端和服务器之间通过线路发送的整数必须具有特定的大小,由它们的通信协议定义。【参考方案5】:试试微软的 UINT32。
大写清楚地表明这是定义为宏。如果您尝试使用尚未包含该宏的其他编译器进行编译,您可以自己定义它并且您的代码不必更改。
【讨论】:
【参考方案6】:uint32 et al. 由宏定义。它们解决了一个历史性的可移植性问题,即当您要求一个 int 或一个 short 时,您将获得多少位跨平台(当有比现在更多的平台选项时)几乎没有保证。 (一个现已失效的 Mac 的 C 编译提供了 8 位短裤!)。
【讨论】:
以上是关于“Uint32”、“int16”等;它们是标准的 C++ 吗?的主要内容,如果未能解决你的问题,请参考以下文章