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)
所以,这就是我到目前为止所做的事情:
我已经在头文件中抽象了这个过程,这是我能用我所知道做的最好的,但我想知道是否有更简单的方法来实现这一点.
我问,因为我想写一个便携式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"这个名字没有特别的意义;他只是选择它作为一个相当短而独特的搜索词.)