【问题标题】:How to maintain fixed size of C variable types over different machines?如何在不同的机器上保持 C 变量类型的固定大小?
【发布时间】:2010-03-24 20:43:33
【问题描述】:

我有所有这些功能。

ssize_t fuc1(int var1, void *buf, size_t count);
int func2(char *charPtr, int mode, int dev);
short func3( long var2);

问题是 C 中的数据类型在不同的机器(64 位和 32 位)上编译时具有不同的大小。即使是 void* 也是如此。由于某些原因。我需要确保这些尺寸在每台机器(64 位和 32 位)上都相同。那么,我应该如何修改这些呢?

【问题讨论】:

  • 如果您解释了为什么需要这些参数的大小跨平台相同,这可能会有所帮助。
  • @John:数据文件在一台机器上写入并在另一台机器上读取的可能性适中,到目前为止,这些芯片都是英特尔的,因此是小端的,但是 SPARC并且 PPC 和 big-endianness 没有跨越突触。
  • @Jonathan:他可能通过某种终结符和去终结符程序来运行这些东西(很糟糕地造了几个词)。当然,没有任何理由担心void * 的跨平台表示。

标签: c++ c


【解决方案1】:

使用 C99、<stdint.h>int32_t 等类型。 More details on Wikipedia.

没有办法对指针类型执行此操作,因为根据定义,它们是特定于平台的。没有有效的用例可能需要它们保持一致,因为它们不可序列化。如果您使用指针变量来存储指针 其他数据(例如,取决于某些标志),请使用某些精确整数类型与指针类型的联合。或者,使用 C99 uintptr_t,并在需要处理时转换为指针。

【讨论】:

    【解决方案2】:

    解决您的困境的老式方法是使用宏定义泛型类型并根据目标平台定义这些宏:

    datatypes.h

    #ifndef DATATYPES_H
    #define DATATYPES_H
    
    #ifdef PLATFORM_32_BIT
    typedef UINT32 unsigned int; // unsigned 32-bit integer
    typedef UINT16 unsigned short;
    typedef UINT08 unsigned char;
    #else
    // Assume 64 bit platform
    typedef UINT32 unsigned short;
    #endif
    
    #endif // DATATYPES_H
    

    当您绝对需要 32 位无符号变量时,您将使用 UINT32 类型。平台定义可以通过命令行传递给编译器。

    由于我没有在 64 位平台上工作过,您将不得不研究 POD 类型的位大小。

    【讨论】:

    • 这曾经是一个很好的解决方案。但是一旦 标头被标准化,最好的做法是使用 如果可用,如果你的编译器还不支持它,至少定义你自己的 typedef 与使用的名称兼容在 中。这样将来移植到支持 的系统会很容易。
    【解决方案3】:

    您不能,至少在 C++03 或 C89 中不能。 C99 有你可以使用的 <stdint.h> 标头,它定义了 uint32_t 等类型,但你对 C++ 来说太幸运了。

    如果您需要它在 C++03 中工作,您需要使用 Boost::Integer EDIT 之类的东西或提供 TR1 的实现。

    【讨论】:

    • C++ TR1 包括 <stdint.h> 更新到与 C99 相同的级别。
    【解决方案4】:

    POSH library(便携式开源线束)可能对您有所帮助。这是由 Write Portable Code 的作者 Brian Hook 创建的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-20
      • 2018-02-05
      • 2018-09-28
      • 1970-01-01
      • 2011-01-28
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多