github コードを参照すると、フォーマット指定子_%qd
_が表示されました。次に、GCCコンパイラをチェックインしましたが、問題なく動作しています。
_#include <stdio.h>
int main()
{
long long num = 1;
printf("%qd\n", num);
return 0;
}
_
printf()
のフォーマット指定子_%qd
_の目的は何ですか?
通常のGoogle検索では_%qd
_に関する記事はほんの少ししかありませんが、今後の参考のために、この回答は私自身の研究をまとめたものです rsp の回答とコメントでの小さなディスカッション Jonathan Leffler および StoryTeller によるセクション。
_
%qd
_は、すべてのマシンで64ビットを快適に処理することを目的としており、元々はbsd-ism(_quad_t
_)でした。ただし、
egcs
(およびその前のgcc
)はll
と同等として扱います。これは常に同等ではありません。openbsd-alphaはlong
64ビットであるため、_quad_t
_はlong
にtypedefされます。その特定のケースでは、printfのような属性が意図したとおりに機能しません。Openbsd-alphaで
sizeof(long long) == sizeof(long)
を使用する場合は、とにかく動作するはずです。つまり、_%ld
_、_%lld
_、および_%qd
_は交換可能です。 OpenBSD/alphaでは、sizeof(long) == sizeof(long long) == 8
。
ISO C99拡張機能が広く使用される前に、プラットフォーム固有の長さオプションがいくつか存在するようになり、q
もその1つでした。これは整数型に使用されたため、printf
は64ビット(クワッドワード)の整数引数を予期します。 BSDプラットフォームでよく見られます。
ただし、C99とC11はどちらも、長さ修飾子q
については何も述べていません。 fprintf()
のmacOS(BSD)マニュアルページは、q
を非推奨としてマークしています。したがって、ll
の代わりにq
を使用することをお勧めします。
参照:
https://gcc.gnu.org/ml/gcc-bugs/1999-02n/msg00166.html
q
は、64ビットを処理するために使用されるprintf関数のワード書式指定子を意味しますすべてのマシンで快適に。
Wikipedia から:
さらに、ISO C99拡張機能が広く使用される前に、プラットフォーム固有の長さオプションがいくつか存在するようになりました。
…
q
-整数型の場合、printfは64ビット(クワッドワード)整数引数を予期します。 BSDプラットフォームで一般的に見られる
最も興味深いC言語関連の質問の1つです。記号リテラル_“%qd”
_はクワッドワードとして表され、Cプログラミング言語のprintf
関数で64ビットを効果的に処理するために使用されると指定されています。また、C標準の1999年版ではsizeof(long long) >= sizeof(long)
と記載されており、_long long
_の範囲のサイズは少なくとも64ビットであると推測できます。