首页 > 解决方案 > `printf()` 中格式说明符“%qd”的用途是什么?

问题描述

%qd我在浏览github代码时看到了格式说明符。然后我检查了 GCC 编译器,它工作正常。

#include <stdio.h>

int main()
{  
    long long num = 1;
    printf("%qd\n", num);
    return 0;
}

格式说明符的用途是%qd什么printf()

标签: cgccformat-specifiersopenbsd

解决方案


%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 都没有提及长度修饰符qfprintf()标记q为已弃用的 macOS (BSD) 手册页。因此,ll建议使用 using 而不是q.

参考:

https://gcc.gnu.org/ml/gcc-bugs/1999-02n/msg00166.html

https://en.wikipedia.org/wiki/Printf_format_string

https://port70.net/~nsz/c/c11/n1570.html#7.21.6.1p7


推荐阅读