Wie AraK sagte, funktioniert die C ++ - Streams-Schnittstelle immer portabel.
std :: size_t s = 1024; std :: cout << s; // oder irgendeine andere Art von Stream wie Stringstream!
Wenn Sie C stdio möchten, gibt es für bestimmte Fälle von "portabel" keine tragbare Antwort darauf. Und es wird hässlich, denn wie Sie gesehen haben, kann die Auswahl der falschen Formatflags eine Compilerwarnung oder eine falsche Ausgabe ergeben.
C99 hat versucht, dieses Problem mit inttypes.h-Formaten wie "%" PRIdMAX "\ n" zu lösen. Aber genau wie bei "% zu" unterstützt nicht jeder c99 (wie MSVS vor 2013). Es gibt "msinttypes.h" -Dateien, die herumschwirren, um damit umzugehen.
Wenn Sie in einen anderen Typ umwandeln, erhalten Sie abhängig von den Flags möglicherweise eine Compiler-Warnung zum Abschneiden oder Ändern des Vorzeichens. Wenn Sie diese Route wählen, wählen Sie einen größeren relevanten Typ mit fester Größe. Eines von unsigned long long und "% llu" oder unsigned long "% lu" sollte funktionieren, aber llu kann in einer 32-Bit-Welt, die übermäßig groß ist, auch die Dinge verlangsamen. (Bearbeiten - Mein Mac gibt eine 64-Bit-Warnung für% llu aus, die nicht mit size_t übereinstimmt, obwohl% lu,% llu und size_t alle dieselbe Größe haben. Und% lu und% llu haben auf meinem MSVS2012 nicht dieselbe Größe Möglicherweise müssen Sie ein passendes Format verwenden.)
In diesem Fall können Sie Typen mit fester Größe verwenden, z. B. int64_t. Aber warte! Jetzt sind wir wieder bei c99 / c ++ 11 und älteres MSVS schlägt erneut fehl. Außerdem hast du auch Casts (zB map.size () ist kein Typ mit fester Größe)!
Sie können einen Header oder eine Bibliothek eines Drittanbieters verwenden, z. B. Boost. Wenn Sie noch keinen verwenden, möchten Sie Ihr Projekt möglicherweise nicht auf diese Weise aufblasen. Wenn Sie nur für dieses Problem einen hinzufügen möchten, verwenden Sie C ++ - Streams oder die bedingte Kompilierung.
Sie sind also auf C ++ - Streams, bedingte Kompilierung, Frameworks von Drittanbietern oder etwas Portables angewiesen, das zufällig für Sie funktioniert.
unsigned long
ist die beste Option, wenn Ihre libc-Implementierung denz
Modifikator nicht unterstützt . Der C99-Standard empfiehltsize_t
, keinen ganzzahligen Konvertierungsrang größer als zu habenlong
, damit Sie einigermaßen sicher sind