我想在 C 中可移植地使用 64 位有符号类型。但是 - 我知道int64_t
不能保证定义。我可以在构建系统生成中使用一些预处理器魔法(例如 CMake 的check_type_size()
)来获取预处理器定义,告诉我是否可以使用它。但是 - 我们确实有PRId64
格式说明符,我们将使用它来将int64_t
值传递给printf()
类似函数。因此,我可以使用的定义PRId64
作为确定是否int64_t
可用的代理吗?
我想在 C 中可移植地使用 64 位有符号类型。但是 - 我知道int64_t
不能保证定义。我可以在构建系统生成中使用一些预处理器魔法(例如 CMake 的check_type_size()
)来获取预处理器定义,告诉我是否可以使用它。但是 - 我们确实有PRId64
格式说明符,我们将使用它来将int64_t
值传递给printf()
类似函数。因此,我可以使用的定义PRId64
作为确定是否int64_t
可用的代理吗?
您可以测试可能由提供的可选宏是否存在
<stdint.h>
,例如INT64_MIN
或,当且仅当实现了INT64_MAX
相应的可选类型(例如)时,才会定义这些宏。int64_t
来自 C99 §7.18 第 4 部分、C11/C17 §7.20 第 4 部分以及 C23 §7.22.1 第 4 部分:
标准目前不要求,如果未实现,
PRId64
则不会定义宏,对于定义的其他可选类型也是如此。<inttypes.h>
int64_t
<stdint.h>
总之:
defined(INT64_MIN)
当且仅当int64_t
实现defined(PRId64)
并不意味着int64_t
实施!defined(PRId64)
意味着int64_t
没有实现是的,但是...
它确实是用于该目的的代理。标准在 7.8.1 中有以下内容
<inttypes.h>
:此处的“托管”是指带有操作系统的系统;因此,是的,您可以使用宏来检测托管环境中相应类型的存在。请注意,符合 C99 的实现可以在不存在的情况下定义 printf 和 scanf 格式宏
int64_t
(正如 Ian Abbott 指出的那样),尽管这似乎是一个相当古怪的场景。另一方面,如果您计划在非托管环境中运行代码(或支持运行代码),例如嵌入式平台或内核,则不应使用,<inttypes.h>
因为该标头可能不可用。那么您可以使用什么来代替呢?int64_t
/uint64_t
在标准中被称为“精确宽度整数”,并在 7.22.2.2 (C23) 和 7.18.1.1 (C99) 中定义。以下内容可在 C23 标准草案的 规范下找到<stdint.h>
:在 C99 中,未指定宽度宏;可以使用 7.18.2.1 中描述的限制宏。这些宏与 C23 宏有类似的警告,可在 7.18 的第 4 段中找到。
也就是说,你可以使用在头文件中定义的宏
typedef
来首先声明类型。例如,INT64_WIDTH
和UINT64_MIN
。