Ich habe den Formatbezeichner gesehen %qd
beim Surfen github Code. Dann habe ich den GCC-Compiler eingecheckt, er funktioniert einwandfrei.
#include <stdio.h>
int main()
{
long long num = 1;
printf("%qd\n", num);
return 0;
}
Was ist der Zweck des Formatbezeichners %qd
in printf()
?
%qd
war dazu gedacht, 64-Bits auf allen Rechnern komfortabel zu handhaben, und war ursprünglich ein bsd-ism (quad_t
).
Jedoch, egcs
(und gcc
davor) behandelt es als gleichwertig mit ll
was nicht immer äquivalent ist: openbsd-alpha ist so konfiguriert long
ist 64 Bit, und daher quad_t
ist typdefiniert long
. In diesem speziellen Fall funktioniert das printf-like-Attribut nicht wie beabsichtigt.
Wenn sizeof(long long) == sizeof(long)
auf openbsd-alpha sollte es trotzdem funktionieren – dh %ld
, %lld
und %qd
sollte austauschbar sein. Auf OpenBSD/alpha, sizeof(long) == sizeof(long long) == 8
.
Vor der weit verbreiteten Verwendung der ISO C99-Erweiterungen gab es mehrere plattformspezifische Längenoptionen. q
war einer von ihnen. Es wurde für Integer-Typen verwendet, was verursacht printf
ein 64-Bit-Integer-Argument (Quad-Wort) erwarten. Es ist häufig in BSD-Plattformen zu finden.
Sowohl der C99 als auch der C11 sagen jedoch nichts über den Längenmodifikator aus q
. Die Handbuchseite von macOS (BSD) für fprintf()
markiert q
als veraltet. Also verwenden ll
wird stattdessen empfohlen q
.
Verweise:
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
meint Quad-Wort Formatbezeichner in der printf-Funktion, die zur Handhabung verwendet wird 64 Bit komfortabel auf allen Maschinen.
Aus Wikipedia:
Darüber hinaus gab es vor der weit verbreiteten Verwendung der ISO C99-Erweiterungen mehrere plattformspezifische Längenoptionen:
…
q
– Veranlasst bei Integer-Typen, dass printf ein 64-Bit-Integer-Argument (Quad-Wort) erwartet. Häufig in BSD-Plattformen zu finden
Eine der interessantesten Fragen zur Sprache C, die es zu beantworten gilt. Das symbolische Wort “%qd”
als Quad-Wort darstellen, das so angegeben ist, dass es verwendet wird, um 64 Bits effektiv mit dem zu verarbeiten printf
Funktion in der Programmiersprache C. Denken Sie auch daran, dass die Ausgabe 1999 der C-Norm dies besagt sizeof(long long) >= sizeof(long)
und man kann daraus schließen, dass der Bereich von long long
hat eine Größe von mindestens 64 Bit.
Das tragbarere Beispiel wäre wahrscheinlich mit
int64_t
. Aber kein schlechtes Q&A– StoryTeller – Unslander Monica
13. Juni 2018 um 6:25 Uhr
Das
q
Längenmodifikator ist eine nicht tragbare, unzuverlässige, antiquierte, veraltete Schreibweisell
. Verwendenll
in Ihrem Code; Ermutigen Sie diejenigen, die den Code auf GitHub pflegen, auf Standard-C99-Formate zu aktualisieren.– Jonathan Leffler
13. Juni 2018 um 6:45 Uhr
printf
Formate werden von der Laufzeitbibliothek implementiert, nicht vom Compiler. Dies ist kein Problem mit gcc (oder egcs oder llvm). Auf meinem Ubuntu 20.04-System zum Beispiel%qd
funktioniert mit gcc und glibc, schlägt aber mit gcc und musl fehl — gleicher Compiler, unterschiedliche Laufzeitbibliotheken.– Keith Thompson
4. Juli 2020 um 20:33 Uhr