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.
Abgesehen von der exabyte-Dateigröße, kann ein Problem bei der Konvertierung in long long int auftreten? – Vincent
@Vincent: Nein. Ganzzahl-Typen können problemlos in einen größeren (oder gleich großen) Integer-Typ konvertiert werden. –
'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