Was ist der richtige printf-Bezeichner zum Drucken von pid_t

Lesezeit: 3 Minuten

Ich verwende derzeit eine explizite Besetzung zu lange und verwende %ld zum Drucken pid_tgibt es einen Spezifizierer wie z %z zum size_t zum pid_t?

Wenn nicht, was die beste Art des Druckens ist pid_t?

  • 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

Benutzeravatar von Jim Balter
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_tsehen 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 – Stellt Monicas Benutzeravatar wieder her
Chux – Wiedereinsetzung von Monica

Bei ganzzahligen Typen, denen ein passender Formatbezeichner fehlt, wie im Fall von pid_tjedoch 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

1410710cookie-checkWas ist der richtige printf-Bezeichner zum Drucken von pid_t

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy