在 C 中,当且仅当 int64_t 可用时才定义 PRId64 是真的吗?

问题描述 投票:0回答:2

我想在 C 中可移植地使用 64 位有符号类型。但是 - 我知道

int64_t
不能保证被定义。我可以在构建系统生成中使用一些预处理器魔法(例如 CMake 的
check_type_size()
)来获取预处理器定义,告诉我是否可以使用它。然而,我们确实有
PRId64
格式说明符,我们用它来将
int64_t
值传递给
printf()
类函数。因此,我可以使用
PRId64
的定义性作为确定
int64_t
是否可用的代理吗?

c 64-bit c99 format-specifiers stdint
2个回答
0
投票

您可以测试

<stdint.h>
可能提供的可选宏是否存在,例如
INT64_MIN
INT64_MAX

来自 C17,§7.20 第 4 段,或 C23,§7.22.1 第 4 段:

对于本文描述的实现提供的每种类型,

<stdint.h>
应声明 typedef 名称并定义关联的宏。相反,对于本文描述的实现未提供的每种类型,
<stdint.h>
不应声明该 typedef 名称,也不应定义关联的宏。实现应提供被描述为“必需”的那些类型,但可能不提供任何其他类型(被描述为“可选”)。


0
投票

该标准在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

© www.soinside.com 2019 - 2024. All rights reserved.