Was ist der Zweck des Formatbezeichners “%qd” in `printf()`?

Lesezeit: 4 Minuten

Benutzer-Avatar
msc

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()?

  • 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 Schreibweise ll. Verwenden ll 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

Benutzer-Avatar
UKFLSUI

%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 llwas 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, %lldund %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

  • 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

Benutzer-Avatar
msc

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

  • Übrigens zum späteren Nachschlagen. Am Ende des Formulars zum Stellen einer Frage befindet sich ein Kontrollkästchen “Beantworten Sie Ihre eigene Frage”. Es ermöglicht Ihnen, sie zusammen zu posten, und es ist nicht nötig, sie im Abstand von einer Minute zu posten.

    – StoryTeller – Unslander Monica

    13. Juni 2018 um 6:27 Uhr

  • C99 sagt nichts über den Längenmodifikator aus qund C11 auch nicht (vgl §7.21.6.1 Die fprintf Funktion ¶7). Die Handbuchseite von macOS (BSD) für fprintf() markiert q als veraltet. Die Wikipedia-Seite beschreibt es nicht als C99-Erweiterung, sondern als plattformspezifische Option, die vor der Erstellung der C99-Erweiterungen existierte.

    – Jonathan Leffler

    13. Juni 2018 um 6:39 Uhr


  • Es ist wichtig zu betonen, dass dies eine GNU-C-Erweiterung ist, sie war nie Teil der C-Sprache. Ich habe der Frage das gcc-Tag hinzugefügt.

    – Ludin

    13. Juni 2018 um 7:38 Uhr

Benutzer-Avatar
Aravinda Meewalaarachchi

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.

  • Da die Mindestgröße von long ist 32-Bit, die Tatsache, dass sizeof(long long) >= sizeof(long) lässt nur auf die Größe schließen long long muss mindestens 32 Bit betragen. Jedoch, C11 §5.2.4.2.1 Größen von Integer-Typen <limits.h> sagt: … Ihre implementierungsdefinierten Werte müssen betragsmäßig (Absolutwert) gleich oder größer sein als die gezeigten, mit demselben Vorzeichen. … Mindestwert für ein Objekt vom Typ long long int LLONG_MIN -9223372036854775807 // −(2⁶³ − 1) was erfordert long long ein 64-Bit-Typ sein.

    – Jonathan Leffler

    13. Juni 2018 um 17:36 Uhr

1206250cookie-checkWas ist der Zweck des Formatbezeichners “%qd” in `printf()`?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy