与 Java 或 C# 不同,C++ 中的原始数据类型的大小可能因平台而异。例如,int
不保证是 32 位整数。各种编译器环境定义了诸如uint32
或dword
用于此目的的数据类型,但似乎没有用于固定大小数据类型的标准包含文件。
实现最大可移植性的推荐方法是什么?
与 Java 或 C# 不同,C++ 中的原始数据类型的大小可能因平台而异。例如,int
不保证是 32 位整数。各种编译器环境定义了诸如uint32
或dword
用于此目的的数据类型,但似乎没有用于固定大小数据类型的标准包含文件。
实现最大可移植性的推荐方法是什么?
我发现这个标题特别有用: BOOST cstdint
通常比发明自己的轮子更好(这会导致维护和测试)。
创建一个名为 types.h 的头文件,并定义您需要的所有固定大小的原始类型(int32、uint32、uint8 等)。要支持多个平台,您可以使用#ifdef
's 或为每个平台设置一个单独的包含目录(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 运算符来实现这些目的。
我希望这有帮助 。. .
ķ
有一个由 C99 标准定义的 stdint.h 头文件和(我认为)ISO C++ 的一些变体。这定义了很好的类型,如 int16_t、uint64_t 等......保证具有特定的大小和表示。不幸的是,它的可用性并不完全是标准的(尤其是微软在这里拖拖拉拉)。
简单的答案是这个,它适用于我所知道的每个 32 或 64 位字节可寻址架构:
请注意,某些 32 位编译器根本没有 64 位类型,因此使用 long long 会限制您使用 64 位系统和一组较小的编译器(包括 gcc 和 MSVC,因此大多数人不会关心这个问题)。
如果其名称以两个下划线 (__) 开头,则数据类型是非标准的。
__int8 (无符号 __int8)
__int16(无符号 __int16)
__int32(无符号 __int32)
__int64(无符号 __int64)
尝试使用boost/cstdint.hpp