Plattformunabhängige size_t Formatbezeichner in c?
Lesezeit: 4 Minuten
Ethan Heilmann
Ich möchte eine Variable vom Typ ausdrucken size_t in C, aber es scheint, dass size_t wird auf verschiedenen Architekturen mit verschiedenen Variablentypen aliased. Beispielsweise löst der folgende Code auf einem Computer (64-Bit) keine Warnungen aus:
size_t size = 1;
printf("the size is %ld", size);
aber auf meinem anderen Computer (32-Bit) erzeugt der obige Code die folgende Warnmeldung:
Warnung: Format ‘%ld’ erwartet den Typ ‘long int *’, aber Argument 3 hat den Typ ‘size_t *’
Ich vermute, dass dies auf den Unterschied in der Zeigergröße zurückzuführen ist, also auf meinem 64-Bit-Computer size_t ist ein Alias für a long int ("%ld"), während auf meinem 32-Bit-Rechner size_t ist einem anderen Typ zugeordnet.
Gibt es einen speziellen Formatbezeichner für size_t?
Ihre Warnmeldung stimmt nicht mit dem Code überein. Die Warnung erwähnt Zeiger, Ihr Code hat keine. Hast du welche entfernt & irgendwo?
– Jens
17. April 2012 um 14:38 Uhr
Hinweise? Nein, ich erhalte keine Warnungen zu Zeigern, je nachdem, auf welchem Computer ich diesen Code ausführe, erhalte ich manchmal überhaupt keine Warnungen. Versuchen Sie den folgenden Testcode: #include int main(){ size_t size = 1; printf(“Die Größe ist %ld”, Größe); 0 zurückgeben; }
– Ethan Heilmann
17. April 2012 um 16:39 Uhr
Siehe auch Plattformübergreifende Formatzeichenfolge für Variablen vom Typ size_t?.
– legoscia
21. September 2012 um 10:10 Uhr
@EthanHeilman Er bezieht sich auf die Tatsache, dass Ihre Warnungen sagen warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *' wenn es wahrscheinlich sollte sagen warning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'. Hast du vielleicht benutzt scanf() stattdessen, wenn Sie diese Warnungen erhalten haben?
– RastaJedi
20. August 2016 um 19:04 Uhr
Mögliches Duplikat von Was ist der richtige Weg, um printf zu verwenden, um ein size_t zu drucken?
– phuklv
6. Mai 2017 um 9:13 Uhr
Adam Rosenfeld
Ja: Verwenden Sie die z Längenmodifikator:
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 (zum char), h (zum short), l (zum long), ll (zum long long), j (zum intmax_t), t (zum ptrdiff_t), und L (zum long double). Siehe §7.19.6.1 (7) des C99-Standards.
was ist der unterschied zwischen zd und zu? Ich verstehe, dass zd dezimal ist, aber ist es signiert, wenn ja, wie wirkt sich zd signiert aus?
– Ethan Heilmann
24. Januar 2010 um 3:51 Uhr
Es ist der Unterschied zwischen a size_t und ein ssize_t; Letzteres wird selten verwendet.
– Adam Rosenfield
24. Januar 2010 um 3:53 Uhr
Richtig, also sollten Sie in diesem Fall verwenden %zuda das Argument vorzeichenlos ist.
@detly: Nein, die z Längenmodifikator ist nicht Teil von C89/C90. Wenn Sie auf C89-kompatiblen Code abzielen, können Sie am besten in umwandeln unsigned long und benutze die l Längenmodifikator stattdessen, zB printf("the size is %lu\n", (unsigned long)size);; unterstützt sowohl C89 als auch Systeme mit size_t größer als long ist kniffliger und würde die Verwendung einer Reihe von Präprozessor-Makros erfordern.
– Adam Rosenfield
25. März 2014 um 6:01 Uhr
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 also unsigniert %ld ist doppelt falsch: falscher Längenmodifikator und falscher Formatkonvertierungsbezeichner. Falls Sie sich fragen, %zd ist für ssize_t (was signiert ist).
MSDNsagt, dass Visual Studio das Präfix „I“ für Code unterstützt, der auf 32- und 64-Bit-Plattformen portierbar ist.
size_t size = 10;
printf("size is %Iu", size);
Es ist MS-spezifisch, was nicht standardkonform ist, also nicht plattformunabhängig
– phuklv
24. Juni 2016 um 7:24 Uhr
@phuclv In der Tat. Und wenn es wirklich heißt – wie die Antwort nahelegt – „tragbar“, ist es noch schlimmer, als ich jemals über MS wusste. Nicht, dass es mich überraschen würde … Ich bin keiner, der ablehnt, weil sich jemand die Mühe gemacht hat, etwas zu beantworten, aber diese Antwort ist einfach falsch. Ah, ich glaube, ich verstehe die Idee hier in “tragbar”. Es muss gesagt werden, dass es sowohl für 32-Bit als auch für 64-Bit funktioniert. Aber natürlich würde es.
– Pryftan
3. Dezember 2019 um 15:00 Uhr
14212100cookie-checkPlattformunabhängige size_t Formatbezeichner in c?yes
Ihre Warnmeldung stimmt nicht mit dem Code überein. Die Warnung erwähnt Zeiger, Ihr Code hat keine. Hast du welche entfernt
&
irgendwo?– Jens
17. April 2012 um 14:38 Uhr
Hinweise? Nein, ich erhalte keine Warnungen zu Zeigern, je nachdem, auf welchem Computer ich diesen Code ausführe, erhalte ich manchmal überhaupt keine Warnungen. Versuchen Sie den folgenden Testcode: #include int main(){ size_t size = 1; printf(“Die Größe ist %ld”, Größe); 0 zurückgeben; }
– Ethan Heilmann
17. April 2012 um 16:39 Uhr
Siehe auch Plattformübergreifende Formatzeichenfolge für Variablen vom Typ size_t?.
– legoscia
21. September 2012 um 10:10 Uhr
@EthanHeilman Er bezieht sich auf die Tatsache, dass Ihre Warnungen sagen
warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'
wenn es wahrscheinlich sollte sagenwarning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'
. Hast du vielleicht benutztscanf()
stattdessen, wenn Sie diese Warnungen erhalten haben?– RastaJedi
20. August 2016 um 19:04 Uhr
Mögliches Duplikat von Was ist der richtige Weg, um printf zu verwenden, um ein size_t zu drucken?
– phuklv
6. Mai 2017 um 9:13 Uhr