2013-08-30 13 views
9

Die printf und scanf Familien von Funktionen in C eine Handvoll primitiver Formatbezeich konsumieren, die auf die grundlegenden Datentypen – %d für int, %llu für unsigned long long int entsprechen usw.Liefert Posix Formatzeichenfolge-Makros für printf/scanf?

Allerdings gibt es eine große Anzahl von standardisiertem Typ Aliase, die man gerne in der Praxis verwenden würde, wie int32fast_t, und man kann und sollte den zugrunde liegenden Grundtyp nicht kennen müssen. Für die Aliase in stdint.h gibt der C-Standard dankbar eine Menge von Makros an, um die entsprechenden Formatzeichenfolgen wie PRI32 in inttypes.h zu generieren.

Gibt es einen analogen Makrosatz für Posix? Posix hat Tonnen von undurchsichtigen Typen wie ssize_t, pid_t, rlim_t, suseconds_t, usw., die alle Variationen der grundlegenden intgral Typen sind. Wie kann man diese Typen in Formatzeichenfolgen portabel verwenden?

+2

Wenn alles andere fehlschlägt, können Sie immer zu '(u) intmax_t' konvertieren und das ausdrucken – Christoph

+0

Interessante Workarounds - daran habe ich nie gedacht: -S –

+0

(Obwohl ich rückwärts gehen müsste, also' scanf', müsste ich mache einen manuellen Überlaufcheck und finde heraus, was genau zu vergleichen ist.) –

Antwort

0

Posix garantiert, dass die sys/types.h-Werte ein "arithmetischer Typ mit angemessener Länge" sind und einige weitere als vorzeichenlose oder signierte "erweiterte Länge" angegeben sind. Die einzige akzeptable Möglichkeit, diese auszugeben, wäre es, sie über die Umwandlung in den größten geeigneten Sprachtyp (u) intmax_t zu übertragen und dann auszugeben.

Das Eingeben von ihnen wäre gefährlicher (d. H. Nicht in einer standardkonformen Weise möglich), da es schwierig wäre, zu garantieren, dass Ihre Umwandlung in den Basistyp nicht übergelaufen ist.

1

Das sfio-Paket (Teil von AT & Die Open-Source-AST-Software von T Labs) verfügt über Funktionen wie printf und scanf, mit denen Sie die Größe des numerischen Werts (normalerweise sizeof()) als zusätzlichen Parameter angeben können. Einige Beispiele:

sfprintf(sfstdout, "%I*d", sizeof(intval), intval); 
sfscanf(sfstdin, "%I*f", sizeof(fltval), &fltval); 

USENIX-Papier: Extended Data Formatting Using Sfio.