Warum wurden nicht neu (Bitbreite spezifisch) printf () Formatoption Strings als Teil C99 adoped?

StackOverflow https://stackoverflow.com/questions/1183679

Frage

Bei der Recherche, wie Cross-Plattform printf() Format-Strings in C zu tun (das heißt, unter Berücksichtigung der Anzahl der Bits, ich erwarte, dass jeder Integer-Argument zu printf() sein sollte) ich über lief dieser Abschnitt der Wikipedia-Artikel über printf() . Der Artikel beschreibt Nicht-Standard-Optionen, den printf() Format-Strings übergeben werden kann, wie (was eine Microsoft-spezifische Erweiterung zu sein scheint):

printf("%I32d\n", my32bitInt);

Es geht weiter, dass:

  

ISO C99 umfasst die inttypes.h Kopf   Datei, die eine Reihe von Makros enthält   für den Einsatz in plattformunabhängige printf   Codierung.

... und dann listet eine Reihe von Makros, die in der Kopfzeile zu finden sind. Mit Blick auf die Header-Datei, um sie zu verwenden Ich würde schreiben:

 printf("%"PRId32"\n", my32bitInt);

Meine Frage ist: bin ich etwas fehlt? Ist das wirklich die Standard-C99 Art und Weise, es zu tun? Wenn ja warum? (Obwohl ich bin nicht überrascht, dass ich nie Code gesehen habe, dass die Format-Strings auf diese Weise verwendet, da es scheint so lästig, ...)

War es hilfreich?

Lösung

Die C Rationale scheint, dass standardisiert bestehende Praxis zu bedeuten:

  

wurde aus dem Header abgeleitet von den gleichen Namen auf mehreren bestehenden 64-Bit-Systemen.

, aber der Rest des Textes schreibt nicht über diese Makros und ich erinnere mich nicht, dass sie zum Zeitpunkt der Praxis bestehenden wurden.

Was folgt, ist nur Spekulation, aber erzogen durch Erfahrung, wie Standardisierungsgremien arbeiten.

Ein Vorteil der C99-Makros über die Standardisierung weitere Formatbezeichner für printf (beachten Sie, dass C99 auch einige hinzugefügt haben) ist, dass die Bereitstellung <inttypes.h> und <stdint.h>, wenn Sie bereits eine Implementierung über die erforderlichen Funktionen in einer Implementierung spezifischer Weise unterstützt nur ist zwei Schreib Dateien mit ausreichend typedef und Makros. Das reduziert die Kosten für die Herstellung der vorhandene Implementierung konforme, das Risiko von Bruch bestehende Programme reduzieren die Nutzung der bestehenden Implementierung Besonderheiten Merkmale dieser (der normale Weg nicht stört) gemacht und die Portierung von konformen Programmen zur Umsetzung zu erleichtern, die nicht Header (sie können von dem Programm zur Verfügung gestellt werden). Wenn darüber hinaus die spezifische Implementierung Möglichkeiten bereits zu der Zeit variiert, ist es nicht favorize eine Implementierung über eine andere.

Andere Tipps

Richtig, das ist, wie der C99-Standard sagt, Sie sollten sie nutzen. Wenn Sie wirklich portablt Code mögen, die zu 100% standardkonformes auf das Schreiben ist, sollten Sie immer eine int mit "%d" und einem int32_t mit "%"PRId32 drucken.

werden die meisten Menschen nicht die Mühe, obwohl, da es nur sehr wenige Fälle, in denen dies versäumt, so zu tun, egal wäre. Sofern Sie Ihren Code Win16 oder DOS portieren, können Sie diese sizeof(int32_t) <= sizeof(int) übernehmen, so dass es harmlos ist, versehentlich eine int32_t als int printf. Ebenso ein long long ist ziemlich universell 64 Bits (obwohl es nicht gewährleistet ist, so sein), so ein int64_t als long long Druck (zum Beispiel mit einem %llx Spezifizierer) ist sicher auch.

Die Typen int_fast32_t, int_least32_t, et al sind so gut wie nie benutzt, so kann man sich vorstellen, dass ihr entsprechender Formatbezeich mehr verwendet werden, auch selten.

Sie können immer werfen nach oben und Verwendung %jd die der intmax_t Formatbezeichner ist.

printf("%jd\n", (intmax_t)(-2));

Ich habe intmax_t zu zeigen, dass jede intXX_t verwendet werden kann, sondern einfach zu long Gießen ist viel besser für den int32_t Fall, dann %ld verwenden.

Ich kann nur darüber spekulieren, warum. Ich mag AProgrammer Antwort oben, aber es gibt einen Aspekt übersehen: Was wollen Sie printf als Format Modifikator Es gibt bereits zwei verschiedene Möglichkeiten, um hinzuzufügen, dass die Zahlen in einer Printf verwendet werden (Breite und Präzision). Hinzufügen eine dritte Art von Zahl zu sagen, wie viele Bits für die Genauigkeit im Argumente sind wäre toll, aber wohin geht sie, um es ohne Menschen verwirrend? Unfortunatey einer der Fehler in C ist, dass printf nicht erweiterbar sein entworfen wurde.

Die Makros sind schrecklich, aber wenn Sie schreiben Code, der in 32-Bit- und 64-Bit-Plattformen tragbar ist, sie sind ein Geschenk des Himmels. Auf jeden Fall gerettet meinen Speck.

Ich denke, die Antwort auf Ihre Frage Warum ist entweder

  • Keiner von einer besseren Art und Weise denken könnte, es zu tun, oder
  • Der Normenausschuss nicht auf etwas einigen konnten sie fühlte, war deutlich besser.

Eine andere Möglichkeit: Abwärtskompatibilität. Wenn Sie mehr zu dem Formatbezeich printf oder zusätzliche Optionen hinzufügen, ist es möglich, dass ein Spezifizierer in einigem Pre-C99-Code wäre ein Format-String hat unterschiedlich interpretiert.

Mit der C99 Änderung, die Sie nicht die Funktionalität von printf ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top