【问题标题】:Cross-platform primitive data types in C++C++ 中的跨平台原始数据类型
【发布时间】:2009-09-06 13:41:32
【问题描述】:

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

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

【问题讨论】:

    标签: c++ cross-platform portability primitive


    【解决方案1】:

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

    通常比发明自己的轮子更好(需要维护和测试)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            两件事:

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

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

            我希望这会有所帮助。 . .

            K

            【讨论】:

              【解决方案6】:

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

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

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

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

              【讨论】:

              • 我在某些平台上看到 int 是 64 位的。 long long 在 C++ 中是非标准的,仅保证大小等于或大于 longchar,在一些罕见的系统上,是 16 位的。这些不是您所做的可移植假设。这就是为什么这么多软件在从 Win32 或 Linux-32 移植到 64 位时遇到问题的原因。
              • 这种响应是我从便携式答案开始的原因。但对不起,你的迂腐缺乏证据。我知道没有任何平台可以将 int 定义为 64 位。 “long long”确实是非标准的。然而有趣的是,它比任何标准的 64 位类型在编译器中的可移植性要高得多。人们不承认这一点让我感到难过。目标是可移植性,而不是标准。我的回答是关于实际的可移植性问题。
              • 投反对票。 “我知道没有任何平台可以将 int 定义为 64 位”缺乏知识!= 正确答案。
              【解决方案7】:

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

              __int8(无符号__int8)

              __int16(无符号__int16)

              __int32(无符号__int32)

              __int64(无符号__int64)

              尝试使用boost/cstdint.hpp

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-01-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-04-14
                相关资源
                最近更新 更多