一些背景:
自 C99 以来,标头stdint.h 是 C 标准的一部分。它包括确保为 8、16、32 和 64 位长整数的 typedef,包括有符号和无符号的。但是,此标头不是 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;
所以,这就是我到目前为止一直在做的事情:
- 检查“char”数据类型是否为 8 位长,因为不能保证为. 如果预处理器变量“CHAR_BIT”不等于8,编译失败
- 现在“char”保证为 8 位长,我创建了一个包含几个无符号字符数组的结构,这些字符对应于整数中的几个字节。
- 我为我的数据类型编写“运算符”函数。加法、乘法、除法、取模、从/到字符串的转换等。
我已经在一个头文件中抽象了这个过程,这是我能做到的最好的,但我想知道是否有更直接的方法来实现这一点。
我问是因为我想编写一个可移植的 C 库。