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

msc*_*msc 20 c openbsd gcc format-specifiers

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

#include <stdio.h>

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

什么是格式说明目的%qdprintf()

Rak*_*lam 18

虽然只有少数文章出现%qd在正常的谷歌搜索中,为了将来参考,这个答案是我自己研究的汇编,rsp的回答以及Jonathan LefflerStoryTeller在评论部分的一些讨论.

%qd旨在在所有机器上舒适地处理64位,最初是bsd-ism(quad_t).

但是,egcs(gcc在此之前)将其视为等效于ll,它并不总是等价的:openbsd-alpha配置long为64位,因此quad_t是typedef long.在该特定情况下,类似printf的属性不能按预期工作.

如果sizeof(long long) == sizeof(long)在OpenBSD-α,它应该反正工作-也就是说%ld,%lld%qd应该是可以互换的.

在广泛使用ISO C99扩展之前,存在几种特定于平台的长度选项,sizeof(long) == sizeof(long long) == 8就是其中之一.它用于整数类型,这导致q期望64位(四字)整数参数.它常见于BSD平台.

但是,C99和C11都没有提及长度调节器printf.q标记fprintf()为已弃用的macOS(BSD)手册页.因此,q建议使用而不是ll.

参考文献:

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


msc*_*msc 9

q是指printf函数中的四字格式说明符,用于在所有机器上舒适地处理64位.

来自维基百科:

此外,在广泛使用ISO C99扩展之前,存在几个特定于平台的长度选项:

...

q - 对于整数类型,会导致printf期望64位(四字)整数参数.常见于BSD平台

  • C99对长度修饰符`q`没有任何说明,C11也没有说(参见[§7.21.6.1`fprintf`函数7](https://port70.net/~nsz/c/c11/n1570.html#7.21 .6.1p7)).`fprintf()`的macOS(BSD)手册页将`q`标记为已弃用.维基百科页面并未将其描述为C99扩展,而是将其描述为在创建C99扩展之前存在的特定于平台的选项. (10认同)
  • 顺便说一句,供将来参考.在[问一个问题](/sf/)表格的底部有一个"回答你自己的问题"复选框.它允许你将它们一起发布,而不是急于将它们分开一分钟. (5认同)
  • 重要的是要强调这是GNU C扩展,它从未成为C语言的一部分.我在问题中添加了gcc标签. (3认同)

Ara*_*chi 5

最有趣的C语言相关问题之一.符号文字“%qd”表示为四字,其被指定为用于printf在C编程语言中有效地处理64位.还要记住,从1999年版的C标准中sizeof(long long) >= sizeof(long)可以看出,并且可以推断出该范围的long long大小至少为64位.