PSPS: (ein Pre-skripted Post-Skript)
Es ist mir gerade in den Sinn gekommen, dass eine mehr vorausschauende Frage den Gedanken enthalten würde: Ist das Nicht-Anzeigen von "0x" (showbase) für Nullwert-Ganzzahlen ein Standardverhalten, oder ist es nur eine Eigenart meiner MinGW-Implementierung?
Alles begann an einem schönen Sonntagmorgen ... Ich möchte einige Handles in ihrer hexadezimalen Darstellung und auf eine konsistente, formatierte Weise ablegen.
Ich möchte eine führende 0x und eine feste Breite , aber dies erweist sich als schwer fassbar mit den erwarteten Stream-Manipulatoren
Der einzige Weg, den ich gefunden habe, ist, die Handles auf einen nicht signierten Long zu werfen.
Das scheint ein bisschen unzumutbar, und ich würde erwarten, dass ich nicht die einzige Person bin, die das jemals wollte.
Fehle ich etwas in den Standard-Hex-Manipulatoren? Liegt es daran, dass der Typ void * (HANDLE) einfach außerhalb der normalen Hex-Behandlung von Ostream definiert wird?
Zusammenfassend: Ich möchte nicht GRIFF auf etwas werfen müssen, was es nicht ist.
und ich möchte nicht hart ein "0x" Präfix codieren. Gibt es eine Möglichkeit, dies mit Standard-Manipulatoren zu tun? oder müsste ich Ostreams Handhabung von HANDLE überladen? (Aber das könnte mich überlasten!)
Hier ist mein Testcode (und seine Ausgabe).
Ich habe '.' als Füllzeichen, für die Klarheit, (ich werde tatsächlich '0' verwenden)
Ich habe das auf Ссылка gefunden - das ist Kopieren / Einfügen direkt von dort.
Klingt für mich nicht nach einem Fehler. ISO C ++ 98, 22.2.2.2.2 / 10 sagt std :: showbase bedeutet vor # printf Konvertierung Qualifier. 22.2.2.2.2 / 7 sagt std :: hex bedeutet die printf conversion specifier ist % x. Also ist das Verhalten IMHO erforderlich, um mit printf identisch zu sein ("% # x", 0); Aber Ссылка sagt: "Für X- oder X-Konvertierungsspezifizierer muss ein Ergebnis ungleich Null 0x (oder 0X) haben vorangestellt. " Das Gleiche gilt für ISO C99, 7.19.6.1 (6): "Für die Konvertierung x (oder X) wird einem Ergebnis ungleich Null 0x (oder 0X) vorangestellt."
Es klingt also wie der C ++ 98-Standard (mit dem Spruch "Mach es wie C's printf ("% # x ", 0)") verlangt dieses doof Verhalten, das du siehst. Der einzige Weg, um zu bekommen, was Sie wollen, wäre, die std :: showbase loszuwerden und 0x explizit auszugeben. Entschuldigung.
Die Tatsache, dass std :: showbase kein "0x" hat, wenn der Wert Null ist, ist manchmal ärgerlich, aber so ist es definiert und es gibt nichts, was Sie dagegen tun können, außer:
%Vor%Die Lücke zwischen dem "0x" und dem Rest ist fixierbar, aber es ist nicht sehr einfach zu erraten. Probieren Sie
aus %Vor%Tags und Links c++ stream formatting manipulators