c++ file c++11 stream standards-compliance

c++ - std:: streampos, std:: streamoff y std:: streamsize a long long int?



file c++11 (2)

Bueno, en lo que se refiere a C ++ 98/03, no hay long long int . Entonces asumiré que estás preguntando sobre C ++ 11.

Se requiere que streamoff y streamoff sean streamoff de un tipo integral ( streampos no es un entero, por lo que no lo streampos a nada que tarde long long ). Como los tipos integrales son tipos básicos, solo pueden definirse mediante C ++ o como una definición específica del compilador.

Por lo tanto, la única pregunta es esta: ¿estos typedefs son más long long ? Todos los tipos integrales son convertibles a un tipo más grande o de igual tamaño (a pesar de firmar / firmar, pero todos los tipos aquí están firmados, así que no hay problema). Pero si es más grande ... ¿qué vas a hacer al respecto?

Asumiendo que no puede cambiar la firma de la función en la que la está "inyectando" (porque si pudiera, no hay razón para no tomar el streamsize la streamsize como el tipo de parámetro y así evitar el problema), no tiene ninguna opción . Tiene un valor de datos que es más grande que lo que necesita la función. No hay forma de evitarlo aquí.

Puede realizar un static_cast en un long long para cerrar el compilador, pero esto no ayudará si el tamaño real no cabe en long long .

En definitiva, este es un problema difícil de resolver. Usted tiene una función que toma un parámetro que es potencialmente demasiado pequeño para lo que está pasando. Lo máximo que puede hacer es detectar cuándo podría ser un problema a través de static_assert . Algo como esto:

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

Para ser honesto, no me preocuparía. Las probabilidades son buenas, que long long será el tamaño integral más grande que tu compilador soporte nativamente.

Para medir la posición / offsets / tamaño de las secuencias, el estándar especifica std::streampos , std::streamoff y std::streamsize , pero están definidas por la implementación.

¿Cómo convertir estos tipos a long long int de una manera segura y portátil? (por ejemplo, para medir un tamaño de archivo e insertarlo en una función que toma un int largo largo como argumento)


Solo pase el valor a cualquier función que necesite una larga duración. std::streamoff y std::streamsize son ambos tipos integrales con signo, y std::streampos es implícitamente convertible a std::streamoff .

edit: supongo que una afirmación de que streamsize / streamoff no es más grande que long long no dañará, en caso de que alguien aparezca con __int128 tamaños de archivo.