2012-10-08 14 views
7

Um Position/Offsets/Größe von Streams zu messen, geben die Standards std::streampos, std::streamoff und std::streamsize an, aber sie sind implementiert.std :: streampos, std :: streamoff und std :: streamsize zu long long int?

Wie konvertiert man diese Typen sicher und portabel zu long long int? (Zum Beispiel, um eine Dateigröße zu messen und sie in eine Funktion zu injizieren, die ein langes long int als Argument benötigt)

Antwort

5

Nun, was C++ 98/03 betrifft, ist keinlong long int. Ich nehme an, Sie fragen nach C++ 11.

Die streamsize und streamoff erforderlich typedefs eines integralen Typs sein (streampos nicht eine ganze Zahl ist, so dass Sie das nicht zu etwas werden, vorbei, die eine long long nimmt). Da ganzzahlige Typen Basistypen sind, können sie nur durch C++ oder als Compiler-spezifische Definition definiert werden.

Daher ist die einzige Frage: Sind diese Typdefs größer als long long? Alle ganzzahligen Typen sind in einen größeren oder gleich großen Typ umwandelbar (ungeachtet aller Vorzeichen und Vorzeichen, aber alle Typen hier sind signiert, also kein Problem). Aber wenn es größer ist ... was wirst du dagegen tun?

Angenommen, Sie können die Signatur der Funktion nicht ändern, in die Sie "injizieren" (denn wenn Sie könnten, gibt es keinen Grund, nicht einfach streamsize als Parametertyp zu wählen und damit das Problem zu vermeiden) Ich habe keine Optionen. Sie haben einen Datenwert, der größer ist als die Funktion. Es gibt keine Möglichkeit, hier herumzukommen.

Sie können eine static_cast in eine long long ausführen, um den Compiler hochzufahren, aber das hilft nicht, wenn die tatsächliche Größe nicht in eine long long passen kann.

Letztendlich ist dies ein hartnäckiges Problem. Sie haben eine Funktion, die einen Parameter akzeptiert, der möglicherweise für das, was Sie übergeben, zu klein ist. Das meiste, was Sie tun können, ist zu erkennen, wenn es ein Problem über eine static_assert sein könnte. Etwas wie dieses:

static_assert(sizeof(std::streamsize) <= sizeof(long long), "Oops."); 

Um ehrlich zu sein, würde ich mich nicht darum sorgen. Odds sind gut, dass long long die größte integrale Größe sein wird, die Ihr Compiler nativ unterstützt.

+0

Abgesehen von der exabyte-Dateigröße, kann ein Problem bei der Konvertierung in long long int auftreten? – Vincent

+0

@Vincent: Nein. Ganzzahl-Typen können problemlos in einen größeren (oder gleich großen) Integer-Typ konvertiert werden. –

+0

'streampos' wird implizit in' streamoff' konvertiert, sodass Sie es an etwas weiterleiten können, das ein 'long long' erwartet. Der Unterschied zwischen 'streampos' und' streamoff' besteht in der Unterstützung von Stateful-Character-Encodings. – Potatoswatter

1

Übergeben Sie einfach den Wert an welche Funktion auch immer lange dauert. std::streamoff und std::streamsize sind beide vorzeichenbehaftete ganzzahlige Typen, und std::streampos ist implizit in std::streamoff konvertierbar.

edit: Ich nehme eine Behauptung, dass Streamsize/Streamoff nicht größer ist als long long wird nicht weh tun, falls jemand mit __int128 Dateigrößen kommt.

Verwandte Themen