Ich habe folgendes
size_t i = 0;
uint32_t k = 0;
printf("i [ %lu ] k [ %u ]\n", i, k);
Beim Kompilieren wird folgende Warnung angezeigt:
format ‘%lu’ expects type ‘long unsigned int’, but argument has type ‘uint32_t’
Als ich dies mit einer Schiene ausführte, bekam ich Folgendes:
Format argument 1 to printf (%u) expects unsigned int gets size_t: k
Vielen Dank für jeden Rat,
uint32_t
von<stdint.h>
oder<inttypes.h>
; Wenn Sie diese Typen verwenden möchten, sollten Sie ein Upgrade auf C89 durchführen. Als Erweiterung ist es wahrscheinlich, dass GCC Ihnen die Verwendung erlaubt, aber C89 hatte keine solche Unterstützung.size_t
ist 'z', wie in"%zu"
.uint32_t
, aber es fehltsize_t
. Die Antwort von @ u0b34a0f6ae beinhaltet beides.Antworten:
Klingt so, als würden Sie erwarten
size_t
, dass es dasselbe ist wieunsigned long
(möglicherweise 64 Bit), wenn es tatsächlich einunsigned int
(32 Bit) ist. Versuchen Sie es%zu
in beiden Fällen.Ich bin mir allerdings nicht ganz sicher.
quelle
int32_t
zufälligint
auf Ihrem Compiler / Ihrer Plattform befindet, heißt das nicht, dass es sich möglicherweise nichtlong
auf einem anderen befindet. Gleiches gilt fürsize_t
. Es ist wirklich sehr anstrengend und macht mehr Arbeit, um diesen Portabilitätsfehler zu erkennen, da die einfache, natürliche Überprüfung darin besteht, nur den Typedef zu ehren, wie es der Compiler tut.%lu
zusammen mit(unsigned long)k
immer richtig.size_t
ist schwieriger, weshalb%zu
in C99 hinzugefügt wurde. Wenn Sie das nicht verwenden können, behandeln Sie es genausok
(long
ist der größte Typ in C89, essize_t
ist sehr unwahrscheinlich, dass er größer ist).Versuchen
Das
z
stellt eine Ganzzahl mit der gleichen Länge dar wiesize_t
, und das im C99-Header definiertePRIu32
Makro repräsentiert eine vorzeichenlose 32-Bit-Ganzzahl.inttypes.h
quelle
printf( "%lu", (unsigned long )i )
. Andernfalls kommt es später aufgrund einer Typänderung zu einer Reihe von Warnungen im gesamten Code.uint32_t
also ist es tatsächlich C99-Code und sollte als solches kompiliert werden.Alles, was benötigt wird, ist, dass die Formatspezifizierer und die Typen übereinstimmen, und Sie können jederzeit umwandeln, um dies zu erreichen.
long
ist mindestens 32 Bit, also%lu
zusammen mit(unsigned long)k
ist immer richtig:size_t
ist schwieriger, weshalb%zu
in C99 hinzugefügt wurde. Wenn Sie das nicht verwenden können, behandeln Sie es genausok
(long
ist der größte Typ in C89, essize_t
ist sehr unwahrscheinlich, dass er größer ist).Wenn Sie die Formatspezifizierer für den übergebenen Typ nicht korrekt erhalten,
printf
entspricht dies dem Lesen von zu viel oder zu wenig Speicher aus dem Array. Solange Sie explizite Casts verwenden, um Typen abzugleichen, ist es portabel.quelle
Wenn Sie nicht über die PRI * Makros verwenden möchten, ein weiterer Ansatz für das Drucken ANY Typ integer ist cast
intmax_t
oderuintmax_t
und Verwendung"%jd"
oder%ju
sind. Dies ist besonders nützlich für POSIX-Typen (oder andere Betriebssystemtypen), für die beispielsweise keine PRI * -Makros definiert sindoff_t
.quelle