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

时间:2018-06-13 06:21:32

标签: c gcc format-specifiers

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

#include <stdio.h>

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

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

3 个答案:

答案 0 :(得分:16)

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

  

%qd旨在让所有人轻松处理64位   机器,最初是bsd-ism(quad_t)。

     

但是,egcs(以及之前的gcc)将其视为等同于ll,   并不总是等价的:配置openbsd-alpha以便long   64位,因此quad_t的类型定义为long。   在那种特殊情况下,类似printf的属性不起作用   意图。

     

如果在openbsd-alpha上sizeof(long long) == sizeof(long),它应该有效   无论如何 - 即%ld%lld%qd应该是可以互换的。

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

但是,C99和C11都没有提及长度修饰符qfprintf()的macOS(BSD)手册页将q标记为已弃用。因此,建议使用ll代替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

答案 1 :(得分:9)

q表示printf函数中的四字格式说明符,用于在所有计算机上轻松处理 64位

来自Wikipedia

  

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

     

...

     

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

答案 2 :(得分:5)

最有趣的C语言相关问题之一。符号文字“%qd”表示为四字,其被指定为用于在C编程语言中使用printf函数有效处理64位。另外请记住,从1999版C标准开始sizeof(long long) >= sizeof(long),可以推断出long long的范围至少为64位。