c - `printf()` 中格式说明符“%qd”的用途是什么?
问题描述
%qd
我在浏览github代码时看到了格式说明符。然后我检查了 GCC 编译器,它工作正常。
#include <stdio.h>
int main()
{
long long num = 1;
printf("%qd\n", num);
return 0;
}
格式说明符的用途是%qd
什么printf()
?
解决方案
%qd
旨在在所有机器上舒适地处理 64 位,并且最初是一个 bsd-ism (quad_t
)。但是,
egcs
(以及gcc
在此之前)将其视为等效于ll
,这并不总是等效的:openbsd-alpha 被配置long
为 64 位,因此quad_t
被 typedef 为long
. 在这种特殊情况下,类似 printf 的属性无法按预期工作。
如果
sizeof(long long) == sizeof(long)
在 openbsd-alpha 上,它应该可以正常工作 - 即%ld
,%lld
, 并且%qd
应该是可互换的。在 OpenBSD/alpha 上,sizeof(long) == sizeof(long long) == 8
.
在广泛使用 ISO C99 扩展之前,已经存在几个特定于平台的长度选项,q
就是其中之一。它用于整数类型,这导致printf
需要 64 位(四字)整数参数。它常见于 BSD 平台。
但是,C99 和 C11 都没有提及长度修饰符q
。fprintf()
标记q
为已弃用的 macOS (BSD) 手册页。因此,ll
建议使用 using 而不是q
.
参考:
https://gcc.gnu.org/ml/gcc-bugs/1999-02n/msg00166.html
推荐阅读
- amazon-s3 - 为了读取 S3 存储中的 1 MB CSV 文件,我应该设置多少 tera 数据中的假脱机空间?
- javascript - 在子类中不使用 super 的情况下如何初始化父类属性?
- android - 来自 python 的 Kotlin 等效 request.post() 是什么?
- ios - 使 UITextfield 只接受片假名字符 - swift
- javascript - 更新 Cloud Firestore 嵌套地图字段中的查询数据
- r - 如何使用简短的脚本根据 colname 的前缀消除除一个重复的列变量之外的所有变量
- python - 有没有办法更新文件而不是得到重复的值?
- android - Android:如何在 Kotlin 中获取自动调整大小的 TextView 的实际文本大小?
- reactjs - Apollo 使用另一个组件中使用的相同先前变量重新获取查询
- authentication - nebular 身份验证响应登录数据