我想在 C 中可移植地使用 64 位有符号类型。但是 - 我知道
int64_t
不能保证被定义。我可以在构建系统生成中使用一些预处理器魔法(例如 CMake 的 check_type_size()
)来获取预处理器定义,告诉我是否可以使用它。然而,我们确实有 PRId64
格式说明符,我们用它来将 int64_t
值传递给 printf()
类函数。因此,我可以使用 PRId64
的定义性作为确定 int64_t
是否可用的代理吗?
您可以测试
<stdint.h>
可能提供的可选宏是否存在,例如INT64_MIN
或INT64_MAX
。
来自 C17,§7.20 第 4 段,或 C23,§7.22.1 第 4 段:
对于本文描述的实现提供的每种类型,
应声明 typedef 名称并定义关联的宏。相反,对于本文描述的实现未提供的每种类型,<stdint.h>
不应声明该 typedef 名称,也不应定义关联的宏。实现应提供被描述为“必需”的那些类型,但可能不提供任何其他类型(被描述为“可选”)。<stdint.h>
该标准在7.8.1中对
<inttypes.h>
有以下规定:
标头
包含标头 并使用托管实现提供的附加功能对其进行扩展。
这里的“托管”是指带有操作系统的系统。如果您计划在嵌入式平台上运行代码(或支持运行它),则不应使用
<inttypes.h>
。那么你可以用什么来代替呢?
int64_t
/uint64_t
在标准中被称为“精确宽度整数”,并在 7.22.2.2 中定义。以下内容可以在<stdint.h>
规范下的标准草案中找到:
7.22.3 指定宽度整数类型的宽度
7.22.3.1 概述
任何已定义宏的每个实例都应替换为适合在中使用的常量表达式 #if 预处理指令。其实现定义的值应等于或大于 后续子条款中给出的值,除非明确规定为给定值。 实现应仅定义与实际的 typedef 名称相对应的宏 提供。
7.22.3.2 精确宽度整数类型的宽度
INTN_WIDTH 完全N
UINTN_WIDTH 恰好 N
也就是说,您可以使用标头中定义的宏,
typedef
首先是类型。例如,INT64_WIDTH
和 UINT64_MIN
。