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)
什么是格式说明目的%qd的printf()?
Rak*_*lam 18
虽然只有少数文章出现%qd在正常的谷歌搜索中,为了将来参考,这个答案是我自己研究的汇编,rsp的回答以及Jonathan Leffler和StoryTeller在评论部分的一些讨论.
%qd旨在在所有机器上舒适地处理64位,最初是bsd-ism(quad_t).但是,
egcs(gcc在此之前)将其视为等效于ll,它并不总是等价的:openbsd-alpha配置long为64位,因此quad_t是typedeflong.在该特定情况下,类似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
q是指printf函数中的四字格式说明符,用于在所有机器上舒适地处理64位.
来自维基百科:
此外,在广泛使用ISO C99扩展之前,存在几个特定于平台的长度选项:
...
q- 对于整数类型,会导致printf期望64位(四字)整数参数.常见于BSD平台
最有趣的C语言相关问题之一.符号文字“%qd”表示为四字,其被指定为用于printf在C编程语言中有效地处理64位.还要记住,从1999年版的C标准中sizeof(long long) >= sizeof(long)可以看出,并且可以推断出该范围的long long大小至少为64位.