Plattformunabhängige size_t Format Bezeich in c?
-
22-09-2019 - |
Frage
Ich möchte eine Variable vom Typ size_t
in C drucken, aber es scheint, dass size_t
auf unterschiedliche Variablentypen auf unterschiedlichen Architekturen aliased ist. Zum Beispiel auf einer Maschine (64-Bit) der folgende Code wirft keine Warnungen:
size_t size = 1;
printf("the size is %ld", size);
aber auf meiner anderen Maschine (32-Bit) der obige Code erzeugt die folgende Warnmeldung an:
Warnung: Format '% ld' erwartet Typ 'Long int *', aber Argument 3 hat Typ 'Size_t *'
I vermuten, dass dies auf die Differenz in Zeigergröße zurückzuführen ist, so dass auf meinem 64-Bit-Maschine mit einem size_t
long int
("%ld"
) aliased ist, während auf meiner 32-Bit-Maschine auf einen anderen Typ size_t
aliased ist.
Sie haben einen Formatbezeichner speziell für size_t
?
Lösung
Ja: Verwenden Sie die z
Längenmodifizierer:
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 Länge Modifikatoren, die verfügbar 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) des C99-Standard.
Andere Tipps
Ja, es gibt. Es ist %zu
(wie in ANSI C99 angegeben).
size_t size = 1;
printf("the size is %zu", size);
Beachten Sie, dass size_t
nicht signiert ist, so %ld
ist doppelt falsch: falsche Längenmodifizierer und falsche Format Konvertierungsspezifizierer. Falls Sie sich fragen, ist %zd
für ssize_t
(die signiert).
MSDN , sagt, dass Visual Studio unterstützt das "I" Präfix für Code portable auf 32- und 64-Bit-Plattformen.
size_t size = 10;
printf("size is %Iu", size);