2016-12-21 3 views
3

Wir verwenden C89 auf einer eingebetteten Plattform. Ich versuchte, aus einem size_t zu drucken, aber es hat nicht funktioniert:Ist der% zu-Spezifizierer für printf erforderlich?

#include <stdio.h> 
int main(void) { 
    size_t n = 123; 
    printf("%zu\n",n); 
    return 0; 
} 

Statt 123, ich habe zu.
Andere Spezifizierer funktionieren ordnungsgemäß.

Wenn size_t existiert sollte nicht zu auch in printf verfügbar sein?
Ist das etwas, mit dem ich meinen Bibliotheksverkäufer in Verbindung bringen sollte, oder kann eine Bibliotheksimplementierung dies ausschließen?

+5

Der 'Z' Präfix war hinzugefügt in C99 glaube ich. –

+0

@KerrekSB Ok. Es scheint nicht annotiert zu sein. http://en.cppreference.com/w/cpp/io/c/fprintf –

+0

Warum sollte eine C++ - Referenz irgendetwas über einen C-Standard sagen? – mch

Antwort

6

Wenn size_t existiert sollte auch nicht in printf vorhanden sein?

size_t zumindest seit C89 existiert, aber der jeweilige Format-Spezifizierer %zu (insbesondere die Länge Modifikator z) wurde seit C99 zum Standard nur hinzugefügt.

Also, wenn Sie nicht verwenden können, C99 (oder C11) und hatten size_t in C89 zu drucken, müssen Sie nur noch zu anderen bestehenden Typen Rückfall, wie zB:

printf("%lu\n", (unsigned long)n); 
+0

Beachten Sie, dass der obige Code auf jeder Plattform ausreichend, aber nicht unbedingt effizient ist, wobei "unsigned long" groß genug ist, um den größtmöglichen Wert von "n" aufzunehmen (unabhängig davon, ob er groß genug war, um den gesamten Bereich von 'size_t'). Es gibt jedoch keine Garantie, dass "size_t" nicht größer als "unsigned long" ist, und es gibt keine Garantie, dass "n" immer in "unsigned long" passt. Ich weiß nicht, wie oft das ein Problem wäre [viele Programme könnten in andere Schwierigkeiten geraten, wenn sie die Größe der sprintf Puffer berechnen ... – supercat

+0

... basierend auf einer Annahme, dass die maximale Länge einer Dezimal-formatierten vorzeichenlosen Länge ist 10 Ziffern und der auszugebende Wert ist länger als das]. – supercat

Verwandte Themen