web-dev-qa-db-ja.com

`printf()`のフォーマット指定子 "%qd"の目的は何ですか?

github コードを参照すると、フォーマット指定子_%qd_が表示されました。次に、GCCコンパイラをチェックインしましたが、問題なく動作しています。

_#include <stdio.h>

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

printf()のフォーマット指定子_%qd_の目的は何ですか?

20
msc

通常の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

https://en.wikipedia.org/wiki/Printf_format_string

https://port70.net/~nsz/c/c11/n1570.html#7.21.6.1p7

17
Rakibul Islam

qは、64ビットを処理するために使用されるprintf関数のワード書式指定子を意味しますすべてのマシンで快適に。

Wikipedia から:

さらに、ISO C99拡張機能が広く使用される前に、プラットフォーム固有の長さオプションがいくつか存在するようになりました。

q-整数型の場合、printfは64ビット(クワッドワード)整数引数を予期します。 BSDプラットフォームで一般的に見られる

9
msc

最も興味深いC言語関連の質問の1つです。記号リテラル_“%qd”_はクワッドワードとして表され、Cプログラミング言語のprintf関数で64ビットを効果的に処理するために使用されると指定されています。また、C標準の1999年版ではsizeof(long long) >= sizeof(long)と記載されており、_long long_の範囲のサイズは少なくとも64ビットであると推測できます。