【发布时间】:2009-09-06 13:41:32
【问题描述】:
与 Java 或 C# 不同,C++ 中的原始数据类型的大小可能因平台而异。例如,int 不保证是 32 位整数。
各种编译器环境为此定义了诸如uint32 或dword 之类的数据类型,但似乎没有针对固定大小数据类型的标准包含文件。
实现最大可移植性的推荐方法是什么?
【问题讨论】:
标签: c++ cross-platform portability primitive
与 Java 或 C# 不同,C++ 中的原始数据类型的大小可能因平台而异。例如,int 不保证是 32 位整数。
各种编译器环境为此定义了诸如uint32 或dword 之类的数据类型,但似乎没有针对固定大小数据类型的标准包含文件。
实现最大可移植性的推荐方法是什么?
【问题讨论】:
标签: c++ cross-platform portability primitive
我发现这个标题特别有用: BOOST cstdint
通常比发明自己的轮子更好(需要维护和测试)。
【讨论】:
创建一个名为 types.h 的头文件,并定义您需要的所有固定大小的原始类型(int32、uint32、uint8 等)。要支持多个平台,您可以使用#ifdef 或为每个平台设置一个单独的包含目录(include_x86、include_x86_64、include_sparc)。在后一种情况下,您将为每个平台拥有单独的构建配置,它们的包含路径中将具有正确的包含目录。根据 Stephen Dewhurst 的“The C++ Gotchas”,第二种方法更可取。
顺便说一句,如果您打算在不同平台之间传递二进制数据,您还必须担心字节顺序。
【讨论】:
C99 标准的一部分是提供此类信息的 stdint.h 头文件。例如,它定义了一个名为 uint32_t 的类型。不幸的是,很多编译器不支持 stdint.h。我见过的 stdint.h 最好的跨平台实现在这里:http://www.azillionmonkeys.com/qed/pstdint.h。您可以将其包含在您的项目中。
如果您使用的是 boost,我相信它还提供了与 stdint 标头等效的东西。
【讨论】:
在头文件中定义一个类型(例如 int32)。对于每个平台,使用另一个 #ifdef 并确保 in32 是 32 位整数。代码中的任何地方都使用 int32 并确保在不同平台上编译时使用正确的定义
【讨论】:
两件事:
首先,有一个名为 limits.h 的头文件,它提供了许多有用的平台 具体信息。例如,它将给出 int 类型的最大值和最小值。 由此可以推断出int类型有多大。
您也可以在运行时使用 sizeof 运算符来实现这些目的。
我希望这会有所帮助。 . .
K
【讨论】:
有一个由 C99 标准定义的 stdint.h 头文件和(我认为)ISO C++ 的一些变体。这定义了很好的类型,如 int16_t、uint64_t 等......保证具有特定的大小和表示。不幸的是,它的可用性并不完全是标准的(尤其是微软在这里拖拖拉拉)。
简单的答案是这个,它适用于我所知道的每一个 32 或 64 位字节可寻址架构:
请注意,某些 32 位编译器根本没有 64 位类型,因此使用 long long 会限制您使用 64 位系统和较小的编译器集(包括 gcc 和 MSVC,所以大多数人不会不关心这个问题)。
【讨论】:
int 是 64 位的。 long long 在 C++ 中是非标准的,仅保证大小等于或大于 long。 char,在一些罕见的系统上,是 16 位的。这些不是您所做的可移植假设。这就是为什么这么多软件在从 Win32 或 Linux-32 移植到 64 位时遇到问题的原因。
如果其名称以两个下划线 (__) 开头,则数据类型是非标准的。
__int8(无符号__int8)
__int16(无符号__int16)
__int32(无符号__int32)
__int64(无符号__int64)
尝试使用boost/cstdint.hpp
【讨论】: