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.
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
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.
13647800cookie-checkGute Einführung in [closed]yes
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 entsprichtlong
. Der richtige Formatbezeichner ist%ld
in dem fall aber wenn man auf einem 32-bit system aufbaut entspricht es demlong 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