11

与 Java 或 C# 不同,C++ 中的原始数据类型的大小可能因平台而异。例如,int不保证是 32 位整数。各种编译器环境定义了诸如uint32dword用于此目的的数据类型,但似乎没有用于固定大小数据类型的标准包含文件。

实现最大可移植性的推荐方法是什么?

4

7 回答 7

11

我发现这个标题特别有用: BOOST cstdint

通常比发明自己的轮子更好(这会导致维护和测试)。

于 2009-09-06T14:17:38.240 回答
8

创建一个名为 types.h 的头文件,并定义您需要的所有固定大小的原始类型(int32、uint32、uint8 等)。要支持多个平台,您可以使用#ifdef's 或为每个平台设置一个单独的包含目录(include_x86、include_x86_64、include_sparc)。在后一种情况下,您将为每个平台拥有单独的构建配置,它们的包含路径中将具有正确的包含目录。根据 Stephen Dewhurst 的“The C++ Gotchas”,第二种方法更可取。

顺便说一句,如果您计划在不同平台之间传递二进制数据,您还必须担心字节顺序。

于 2009-09-06T13:55:20.653 回答
5

C99 标准的一部分是提供此类信息的 stdint.h 头文件。例如,它定义了一个名为 uint32_t 的类型。不幸的是,很多编译器不支持 stdint.h。我见过的 stdint.h 最好的跨平台实现在这里:http ://www.azillionmonkeys.com/qed/pstdint.h 。您可以将其包含在您的项目中。

如果您使用的是 boost,我相信它还提供了与 stdint 标头等效的东西。

于 2009-09-06T13:55:49.767 回答
3

在头文件中定义一个类型(例如 int32)。对于每个平台,使用另一个 #ifdef 并确保 in32 是 32 位整数。代码中的任何地方都使用 int32 并确保在不同平台上编译时使用正确的定义

于 2009-09-06T13:45:05.373 回答
2

两件事情:

首先,有一个名为 limits.h 的头文件,它提供了许多有用的平台特定信息。例如,它将给出 int 类型的最大值和最小值。由此,您可以推断出 int 类型有多大。

您也可以在运行时使用 sizeof 运算符来实现这些目的。

我希望这有帮助 。. .

ķ

于 2009-09-06T13:46:26.680 回答
2

有一个由 C99 标准定义的 stdint.h 头文件和(我认为)ISO C++ 的一些变体。这定义了很好的类型,如 int16_t、uint64_t 等......保证具有特定的大小和表示。不幸的是,它的可用性并不完全是标准的(尤其是微软在这里拖拖拉拉)。

简单的答案是这个,它适用于我所知道的每个 32 或 64 位字节可寻址架构:

  • 所有 char 变量都是 1 个字节
  • 所有短变量都是 2 个字节
  • 所有 int 变量都是 4 字节
  • 不要使用大小不定的“长”。
  • 所有支持 64 位数学的已知编译器都允许将“long long”作为本机 64 位类型。

请注意,某些 32 位编译器根本没有 64 位类型,因此使用 long long 会限制您使用 64 位系统和一组较小的编译器(包括 gcc 和 MSVC,因此大多数人不会关心这个问题)。

于 2009-09-06T13:56:14.863 回答
2

如果其名称以两个下划线 (__) 开头,则数据类型是非标准的。

__int8 (无符号 __int8)

__int16(无符号 __int16)

__int32(无符号 __int32)

__int64(无符号 __int64)

尝试使用boost/cstdint.hpp

于 2014-12-23T17:52:28.190 回答