Ich verwende derzeit eine explizite Besetzung zu lange und verwende %ld
zum Drucken pid_t
gibt es einen Spezifizierer wie z %z
zum size_t
zum pid_t
?
Wenn nicht, was die beste Art des Druckens ist pid_t
?
Ich verwende derzeit eine explizite Besetzung zu lange und verwende %ld
zum Drucken pid_t
gibt es einen Spezifizierer wie z %z
zum size_t
zum pid_t
?
Wenn nicht, was die beste Art des Druckens ist pid_t
?
Jim Balter
Es gibt keinen solchen Spezifizierer. Ich denke, was du tust (casting the pid_t
zu long
und damit drucken "%ld"
) ist gut; Sie könnten einen noch breiteren int-Typ verwenden, aber es gibt keine Implementierung, wo pid_t
ist größer als long
und wird es wahrscheinlich nie sein.
Nett. Wenn Sie anpassen möchten printf
mit Ihrer eigenen Spezifikation für pid_t
sehen Sie sich diese Seite an: stackoverflow.com/questions/9260170/…
– Verrückter Physiker
12. Dezember 2013 um 1:59 Uhr
Hängt die Gesamtzahl der Prozesse davon ab, wie viele Bits das Betriebssystem hat? zB kann ein Betriebssystem mehr sizeof(int) haben?
– Bilal Syed Hussain
12. Dezember 2013 um 2:13 Uhr
Siehe stackoverflow.com/questions/1922761/… … pid_t ist normalerweise 32 Bit, unabhängig von der Bitgröße des Betriebssystems. Ein System könnte größere haben, aber ich würde es nicht erwarten. In jedem Fall wird lang genug für die Sicherheit sein.
– Jim Balter
12. Dezember 2013 um 4:47 Uhr
Hmmm, wenn pid_t normalerweise 32 Bit ist, unabhängig von der Bitgröße des Betriebssystems. gilt dann für Implementierungen wo long
ist 64-Bit, Drucken mit a "%ld"
wird sicherlich zu Problemen führen.
– chux – Wiedereinsetzung von Monica
23. Dezember 2019 um 18:00 Uhr
@chux-ReinstateMonica Bitte lies die Frage: “Ich verwende derzeit eine explizite Besetzung zu lange und die Verwendung von %ld” — das sagte ich “ist in Ordnung”. Natürlich gibt es ein Problem bei der Verwendung von %ld, ohne zu garantieren, dass ein long übergeben wird.
– Jim Balter
23. Dezember 2019 um 23:05 Uhr
Chux – Wiedereinsetzung von Monica
Bei ganzzahligen Typen, denen ein passender Formatbezeichner fehlt, wie im Fall von pid_t
jedoch mit bekannter Zeichenhaftigkeit1auf die breiteste passende signierte Schrift gegossen und gedruckt.
Wenn die Vorzeichen für andere Systemtypen nicht bekannt sind, wandeln Sie sie in den breitesten nicht signierten Typ oder eine alternative Meinung um
pid_t pid = foo();
// C99
#include <stdint.h>
printf("pid = %jd\n", (intmax_t) pid);
Oder
// C99
#include <stdint.h>
#include <inttypes.h>
printf("pid = %" PRIdMAX "\n", (intmax_t) pid);
Oder
// pre-C99
pid_t pid = foo();
printf("pid = %ld\n", (long) pid);
1
Das pid_t
Datentyp ist a vorzeichenbehaftete Ganzzahl Typ, der eine Prozess-ID darstellen kann.
“Wenn die Vorzeichen nicht bekannt sind, wandeln Sie sie in den breitesten unsignierten Typ um” – ich würde dies nicht empfehlen. Casting zu uintmax_t
und Drucken mit %ju
druckt alle negativen Werte falsch, beim Casting zu intmax_t
und Drucken mit %jd
druckt nur Werte > INTMAX_MAX
falsch. (Andererseits sind Situationen, in denen man wirklich nicht weiß, ob ein Typ negative Werte enthält, ziemlich selten.)
– Jim Balter
23. Dezember 2019 um 23:46 Uhr
@JimBalter Fairer Punkt. Bei unbekanntem Vorzeichen gibt es den Kompromiss, dass negative Werte fälschlicherweise als große Werte oder große Werte als negativ gedruckt werden. Ich würde erwarten, dass es normalerweise natürlicher ist, es zu verwenden, wenn die Vorzeichen unbekannt sind intmax_t
da kleine Werte üblicher sind, noch Konvertierung vorzeichenbehaftete Ganzzahl zu uintmax_t
ist enger definiert, was keine Informationen verliert (daher meine Präferenz) als vorzeichenlose Ganzzahl zu intmax_t
kann. Wähle dein Gift .
– chux – Wiedereinsetzung von Monica
24. Dezember 2019 um 0:12 Uhr
Ich bekomme. %d hello.c:9:42: Warnung: Format gibt den Typ ‘long’ an, aber das Argument hat den Typ ‘pid_t’ (auch bekannt als ‘int’) [-Wformat] wenn ich ld versuche
– Koray Tugay
15. Juni 2015 um 15:34 Uhr
@KorayTugay Beachten Sie die obigen Worte: “Ich verwende derzeit eine explizite Besetzung zu lang”.
– Jim Balter
30. April 2016 um 23:24 Uhr