在C89中是否有任何成熟/标准化的方法来使用固定宽度的整数?

Leh*_*nti 6 c bit-manipulation c89 ansi-c

一些背景:

标题stdint.h 是自C99以来C标准的一部分.它包括typedef,确保为8,16,32和64位长整数,包括有符号和无符号.但是,此标头不是C89标准的一部分,我还没有找到任何直接的方法来确保我的数据类型具有已知长度.

了解实际主题

下面的代码是SQLite(用C89编写)如何定义64位整数,但我觉得它并不令人信服.也就是说,我认为它无处不在.最糟糕的是,它可能会无声地失败:

/*
** CAPI3REF: 64-Bit Integer Types
** KEYWORDS: sqlite_int64 sqlite_uint64
**
** Because there is no cross-platform way to specify 64-bit integer types
** SQLite includes typedefs for 64-bit signed and unsigned integers.
*/
#ifdef SQLITE_INT64_TYPE
  typedef SQLITE_INT64_TYPE sqlite_int64;
  typedef unsigned SQLITE_INT64_TYPE sqlite_uint64;
#elif defined(_MSC_VER) || defined(__BORLANDC__)
  typedef __int64 sqlite_int64;
  typedef unsigned __int64 sqlite_uint64;
#else
  typedef long long int sqlite_int64;
  typedef unsigned long long int sqlite_uint64;
#endif
typedef sqlite_int64 sqlite3_int64;
typedef sqlite_uint64 sqlite3_uint64;
Run Code Online (Sandbox Code Playgroud)

所以,这就是我到目前为止所做的事情:

  • 检查"char"数据类型是否为8位长,因​​为它不能保证.如果预处理器变量"CHAR_BIT"不等于8,则编译失败
  • 现在"char"保证是8位长,我创建了一个包含几个无符号字符数组的结构,它对应于整数中的几个字节.
  • 我为我的数据类型编写了"operator"函数.加法,乘法,除法,模数,从/到字符串的转换等

我已经在头文件中抽象了这个过程,这是我能用我所知道做的最好的,但我想知道是否有更简单的方法来实现这一点.

我问,因为我想写一个便携式C库.

Kei*_*son 11

首先,您应该问自己是否真的需要支持不提供的实现<stdint.h>.它在1999年被标准化,甚至许多C99之前的实现都可能将其作为扩展.

假设你确实需要这个,那么ISO G标准委员会成员Doug Gwyn就为C9x创建了几个新头文件的实现(当时知道C99),与C89/C90兼容.标头属于公共领域,应该是合理的便携式.

http://www.lysator.liu.se/(nobg)/c/q8/index.html

(据我所知,"q8"这个名字没有特别的意义;他只是选择它作为一个相当短而独特的搜索词.)

  • @jrodatus:开发人员应该问自己*任何*设计决策的原因.例如,C在1989年引入了原型; 我不会编写使用旧式函数声明的代码,除非我有特定的需要这样做.这同样适用于`<stdint.h>`; 唯一真正的区别在于它是在18年前推出而不是28年.当然,如果你确实需要这种便携性,你应该尽一切努力确保你拥有它. (3认同)