wake-up-neo.com

Plattformunabhängig size_t Formatbezeichner in c?

Ich möchte eine Variable vom Typ size_t in C, aber es scheint, dass size_t ist auf verschiedene Variablentypen auf verschiedenen Architekturen ausgerichtet. Beispielsweise gibt der folgende Code auf einem Computer (64-Bit) keine Warnungen aus:

size_t size = 1;
printf("the size is %ld", size);

auf meinem anderen Computer (32-Bit) erzeugt der obige Code jedoch die folgende Warnmeldung:

warnung: Format '% ld' erwartet den Typ 'long int *', aber Argument 3 hat den Typ 'size_t *'

Ich vermute, das liegt an der unterschiedlichen Zeigergröße, so dass auf meinem 64-Bit-Rechner size_t ist aliasiert zu einem long int ("%ld"), während auf meinem 32-Bit-Computer size_t ist auf einen anderen Typ ausgerichtet.

Gibt es einen Formatbezeichner speziell für size_t?

74
Ethan Heilman

Ja: Verwenden Sie den Längenmodifikator z:

size_t size = sizeof(char);
printf("the size is %zu\n", size);  // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size);  // hex size_t

Die anderen verfügbaren Längenmodifikatoren sind hh (für char), h (für short), l (für long), ll (für long long), j (für intmax_t), t (für ptrdiff_t) und L (für long double). Siehe §7.19.6.1 (7) der C99-Norm.

108
Adam Rosenfield

Ja da ist. Es ist %zu (wie in ANSI C99 angegeben).

size_t size = 1;
printf("the size is %zu", size);

Beachten Sie, dass size_t ist nicht signiert, daher %ld ist doppelt falsch: falscher Längenmodifikator und falscher Formatkonvertierungsspezifikator. Falls Sie sich fragen, %zd ist für ssize_t (die signiert ist).

39
maxschlepzig

MSDN , besagt, dass Visual Studio das Präfix "I" für portierbaren Code auf 32- und 64-Bit-Plattformen unterstützt.

size_t size = 10;
printf("size is %Iu", size);
1
Arkantos