浏览github代码时,我看到了格式说明符%qd
。然后我检查了GCC编译器,它运行正常。
#include <stdio.h>
int main()
{
long long lli=1;
printf("%qd\n", lli);
return 0;
}
%qd
中格式说明符printf()
的用途是什么?
答案 0 :(得分:16)
虽然在正常的谷歌搜索中只有少数几篇文章出现%qd
,但为了将来参考,这个答案是我自己研究的汇编,rsp的回答和这里的小讨论在评论部分Jonathan Leffler和StoryTeller。
%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都没有提及长度修饰符q
。 fprintf()
的macOS(BSD)手册页将q
标记为已弃用。因此,建议使用ll
代替q
。
参考文献:
https://gcc.gnu.org/ml/gcc-bugs/1999-02n/msg00166.html
答案 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位。