Ich möchte eine Variable vom Typ size_t
in C ausdrucken, aber es scheint, dass size_t
sie auf verschiedene Variablentypen auf verschiedenen Architekturen ausgerichtet ist. Auf einem Computer (64-Bit) gibt der folgende Code beispielsweise 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: Das Format '% ld' erwartet den Typ 'long int *', aber Argument 3 hat den Typ 'size_t *'.
Ich vermute, dass dies auf die unterschiedliche size_t
Zeigergröße zurückzuführen ist , sodass auf meinem 64-Bit-Computer ein Alias für a long int
( "%ld"
) erfolgt, während auf meinem 32-Bit-Computer size_t
ein Alias für einen anderen Typ erfolgt.
Gibt es einen speziellen Formatbezeichner für size_t
?
c
platform-independent
size-t
format-string
format-specifiers
Ethan Heilman
quelle
quelle
&
irgendwo welche entfernt?warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'
wenn es wahrscheinlich soll sagen werdenwarning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'
. Haben Sie vielleichtscanf()
stattdessen verwendet, als Sie diese Warnungen erhielten?Antworten:
Ja: Verwenden Sie den
z
Längenmodifikator:Die anderen verfügbaren Längenmodifikatoren sind
hh
(fürchar
),h
(fürshort
),l
(fürlong
),ll
(fürlong long
),j
(fürintmax_t
),t
(fürptrdiff_t
) undL
(fürlong double
). Siehe §7.19.6.1 (7) des C99-Standards.quelle
size_t
und anssize_t
; Letzteres wird selten verwendet.%zu
, da das Argument nicht signiert ist.z
ist nicht Teil von C89 / C90. Wenn Sie C89-kompatiblen Code anstreben, können Sie ihn am besten umwandelnunsigned long
undl
stattdessen den Längenmodifikator verwenden, zprintf("the size is %lu\n", (unsigned long)size);
. Die Unterstützung von C89 und Systemen mitsize_t
größeren alslong
ist schwieriger und würde die Verwendung einer Reihe von Präprozessormakros erfordern.Ja da ist. Dies ist
%zu
(wie in ANSI C99 angegeben).Beachten Sie, dass dies
size_t
ohne Vorzeichen ist und%ld
daher doppelt falsch ist: falscher Längenmodifikator und falscher Formatkonvertierungsspezifizierer. Falls Sie sich fragen,%zd
ist fürssize_t
(was signiert ist).quelle
Laut MSDN unterstützt Visual Studio das Präfix "I" für Code, der auf 32- und 64-Bit-Plattformen portierbar ist.
quelle