Was ist der Zweck der h-und hh-Modifikatoren für printf?

Abgesehen von %hn und %hhn (wo die h oder hh gibt die Größe der Spitzen-zu Objekt), was ist der Punkt, der h und hh Modifikatoren für printf Formatbezeichner?

Aufgrund der Standard-promotions, die von der Norm geforderten angewendet werden bei variadischen Funktionen, ist es unmöglich, die Argumente vom Typ char oder short (oder jede signed/unsigned-Varianten davon)printf.

Laut 7.19.6.1(7), die h modifier:

Gibt an, dass eine nachfolgende d -, i, o, u, x oder X umwandlungsspezifikator gilt für eine
Typ short int oder unsigned short-int-argument (das argument wird
gefördert wurden entsprechend den integer-promotions, aber sein Wert wird
umgewandelt werden zum Typ short int oder unsigned short int vor dem drucken);
oder eine folgende n-Umwandlung Planer gilt ein Zeiger auf ein short
int-argument.

Wenn das argument war eigentlich der Typ short oder unsigned short, dann Förderung zu int gefolgt von einer Umwandlung zurück zu short oder unsigned short wird der Ertrag der gleichen Wert als Förderung zu int ohne Konvertierung zurück. So, für Argumente vom Typ short oder unsigned short, %d, %u usw. geben sollte identische Ergebnisse zu %hd, %hu usw. (und ebenso für char Arten und hh).

Soweit ich das beurteilen kann, die einzige situation, in der h oder hh modifier könnte möglicherweise nützlich ist, wenn das übergebene argument es eine int außerhalb der Reichweite von short oder unsigned short z.B.

printf("%hu", 0x10000);

aber mein Verständnis ist, dass man die falsche Art, wie diese Ergebnisse zu undefiniertem Verhalten sowieso, so dass Sie konnte es nicht erwarten, es zu drucken 0.

Einer realen Welt Falle, die ich gesehen habe ist der code wie dieser:

char c = 0xf0;
printf("%hhx", c);

denen der Autor erwartet, dass es zu drucken f0 trotz der Umsetzung mit einem einfachen char Typ, der zu Unterschreiben (in dem Fall printf("%x", c) drucken würde fffffff0 oder ähnliches). Aber ist diese Erwartung gerechtfertigt?

(Hinweis: Was passiert, ist, dass die ursprüngliche Art war char, die beworben wird zu int umgewandelt und zurück unsigned char statt char, wodurch sich der Wert, wird gedruckt. Aber nicht den standard angeben, dieses Verhalten, oder ist es ein detail, dass kaputte software könnte sich auf?)

Gute Frage, und noch mehr so zu sehen, Sie wird rücksichtslos wählerisch mit der Antwort.
Sehr schöne Frage. Ich arbeite auf eine formatierte i/o-Implementierung, und jetzt, während Sie versuchen, zu verfolgen die standard-stieß ich auf die gleiche Frage. Vielen Dank für die Veröffentlichung

InformationsquelleAutor R.. | 2011-01-03

Schreibe einen Kommentar