以下是在 Emacs C 源代码中使用整数类型的一些准则。这些准则有时会给出不同的建议,需结合实际情况合理判断。
s 的长度必须在 int 范围内,否则避免编写 int len = strlen (s);。
size_t 替代 ptrdiff_t,或使用 uintptr_t 替代 intptr_t)。
int 类型。
更通用地,对于已知范围在 int 内的整数(例如屏幕列计数),优先使用 int 类型。
ptrdiff_t 类型。这是 Emacs 优先使用有符号类型的通用规则之一。使用 ptrdiff_t 会将对象大小限制为 PTRDIFF_MAX 字节,但更大的对象本身就会导致指针减法异常,因此该限制并非任意设定。
ssize_t 类型,除非与存在 ssize_t 相关限制的底层 API 交互。尽管在常规平台上它与 ptrdiff_t 等效,但 ssize_t 的位数有时会更窄,用于大小相关计算可能引发溢出。此外,ptrdiff_t 的通用性和标准化程度更高,拥有标准的 printf 格式化符号,也是 Emacs 内部大小溢出检查的基础类型。使用 ssize_t 时请注意,POSIX 标准仅支持其在 −1 .. SSIZE_MAX 范围内的取值。
intptr_t 类型。
但对于可能跨越页边界的指针运算,优先使用 uintptr_t 类型。例如,在 32 位地址空间的机器上,数组可能跨越 0x7fffffff/0x80000000 边界,此时对 (intptr_t) 0x7fffffff 加 1 会触发整数溢出。
EMACS_INT 类型表示与 Emacs Lisp 定数相互转换的值,因为定数运算基于 EMACS_INT 实现。
off_t、time_t)。除非确认安全,否则不要假设系统类型为有符号类型。例如,off_t 始终为有符号类型,但 time_t 并非一定如此。
intmax_t 类型。
printf 系列函数可通过 "%"PRIdMAX 格式打印该类型的值。
bool、false 和 true。
使用 bool 能让程序更易读,且比使用 int 效率更高。
尽管使用 int、0 和 1 也可正常运行,但这种旧写法正逐步被淘汰。
使用 bool 时,请遵守 bool 替代实现的限制。
特别地,布尔位域必须使用 bool_bf 类型而非 bool,以确保在标准 GCC 编译 Objective-C 时也能正常工作。
unsigned int 或 signed int 而非 int,因为 int 的可移植性较差:其符号属性不确定。
单比特位域应使用 unsigned int 或 bool_bf,以保证其取值为 0 或 1。