Gute Einführung in [closed]

Lesezeit: 4 Minuten

Ich möchte die Verwendung empfehlen <inttypes.h> zu jemandem tun printf mit gemischten 32/64-Bit-Builds. Ich habe versucht, eine Einführungs- oder Tutorial-Seite mit einigen Beispielen und Nutzungsrichtlinien zu googeln, aber ich konnte keine finden.

Kann jemand eine Einführung oder ein Tutorial für empfehlen <inttypes.h>?

  • Was genau meinst du mit “gemischte 32/64-Bit-Builds”? Wird vom Benutzer erwartet, dass er die Typen mit fester Größe verwendet stdint.h? Gibt es einen bestimmten Mangel in Edwins Antwort, der dazu geführt hat, dass das Kopfgeld hinzugefügt wurde?

    – Michael Burr

    15. Juni 2011 um 0:44 Uhr

  • @Michael: Ja, das Problem tritt auf, wenn Sie Integer-Typen mit bekannter Breite wie verwenden int64_t unter LP64 wo das entspricht long. Der richtige Formatbezeichner ist %ld in dem fall aber wenn man auf einem 32-bit system aufbaut entspricht es dem long long dann brauchst du %lld. Ich hatte auf eine Beschreibung gehofft, die beide zur Verwendung motiviert <inttypes.h> (wie ich es kurz in diesem Kommentar tue) und Beispiele liefern. Etwas, auf das ich hinweisen könnte, um mir zu ersparen, das Warum und das Wie erklären zu müssen.

    – Ben Jackson

    15. Juni 2011 um 4:02 Uhr

Benutzer-Avatar
Edwin Buck

Versuchen http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html für den Anfang.

Ein besseres Beispiel für die Verwendung der neuen portablen Formatierungsmakros finden Sie in avr-libc. Ich habe ein Beispiel (aus dem Link) zur Veranschaulichung beigefügt. QNX-Bibliotheken haben auch eine besser lesbare Beschreibung (wenn Sie die Spezifikation nicht gerne kalt lesen), obwohl Sie fast bis zum Ende der Seite scrollen müssen, um zum Kern der Beschreibungen zu gelangen.

#include <inttypes.h>

uint8_t smallval;
int32_t longval;
...
printf("The hexadecimal value of smallval is %" PRIx8
       ", the decimal value of longval is %" PRId32 ".\n",
       smallval, longval);

Beachten Sie, dass dies den impliziten Verkettungsoperator “String” “String” verwendet, um die Zeichenfolge zu erhalten (in diesem Beispiel).

"The hexadecimal value of smallval is %x, the decimal value of longval is %ld.\n"

Ein Versuch, die Namenskonvention zu zerlegen, scheint darauf hinzudeuten:

  • (erste drei Buchstaben)
    • PRI für das printf-Format
    • SCN für scanf-Format
  • (vierter Buchstabe)
    • x für hexadezimale Formatierung
    • u für unsignierte Formatierung
    • o für oktale Formatierung
    • i für ganzzahlige Formatierung
    • d für Dezimalformatierung
  • (zusätzliche Buchstaben)
    • 8 für acht Bit
    • 16 für sechzehn Bit
    • 32 für zweiunddreißig Bit
    • 64 für vierundsechzig Bit
    • FAST8 für “schnelle” acht Bit
    • FAST16 für “schnelle” sechzehn Bit
    • FAST32 für “schnelle” zweiunddreißig Bit
    • FAST64 für “schnelle” 64 Bit
    • LEAST8 für “wenigstens” acht Bit
    • LEAST16 für “wenigstens” sechzehn Bit
    • LEAST32 für “mindestens” zweiunddreißig Bit
    • LEAST64 für “wenigstens” vierundsechzig Bit
    • PTR für Zeiger
    • MAX für maximal unterstützte Bitgröße

Also PRIx8 bedeutet printf-Format-Anweisung zum Formatieren in hexadezimale acht Bits.

  • Ah, was für eine gute Verwendung, String-Literale nebeneinander zu stellen.

    – Seth Carnegie

    9. Mai 2012 um 0:28 Uhr

  • PTR steht für Zeigergröße ganze Zahlen (size_t,intptr_t,ptrdiff_t), keine Zeiger. Auf mindestens einer meiner Plattformen (OSX) erhalte ich eine Fehlermeldung bei Verwendung von PRIxPTR mit void*. Verwenden Sie %p für Zeiger.

    – Rick Berge

    8. Juli 2013 um 19:55 Uhr


  • @RickBerge: Beachten Sie, dass die PTR-Makros ausschließlich für sind intptr_t und uintptr_t; die Standards C99 und C11 definieren den Formatmodifikator z a benennen size_t Argument (daher "%zu"zum Beispiel) und sie definieren t a benennen ptrdiff_t (somit "%td"zum Beispiel).

    – Jonathan Leffler

    31. März 2015 um 14:45 Uhr

Ich gehe immer zum Standard (PDF-Link) für diese Dinge; Sie sind nicht zu kompliziert, sobald Sie die Muster herausgefunden haben, in denen sie eingerichtet sind. Der relevante Abschnitt ist §7.8 Formatkonvertierung von Integer-Typen <inttypes.h>.

HP hat eine gute Referenz zum Schreiben von portablem Code und gibt einige spezifische Ratschläge für die Verwendung von inttypes.h

Portablen Code schreiben

Ich beginne immer bei Wikipedia, um einen Header nachzuschlagen. <inttypes.h> scheint bei Wikipedia sehr problematisch zu sein. Der nächste Schritt, den ich dann machen würde, ist zu gehen Diese Seite. Diese vorherige Seite listet jedes Makro auf und gibt ein Beispiel. Du könntest auch auschecken Diese Seite, die Ihnen tatsächlich die Header-Datei anzeigt. Ich glaube nicht, dass dies wirklich Tutorials sind, aber sie sind ein guter Ausgangspunkt.

1364780cookie-checkGute Einführung in [closed]

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

Privacy policy