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