std::streampos、std::streamoff和std::streamsize是否为long-long-in
std::streampos, std::streamoff and std::streamsize to long long int?
要测量流的位置/偏移量/大小,标准指定了std::streampos
、std::streamoff
和std::streamsize
,但它们是实现定义的。
如何以安全和可移植的方式将这些类型转换为long long int
?(例如,测量文件大小并将其注入以长整型为参数的函数中)
好吧,就C++98/03而言,没有long long int
。所以我假设你在问C++11。
streamsize
和streamoff
必须是整数类型的typedef(streampos
不是整数,因此不会将其传递给任何需要long long
的对象)。由于积分类型是基本类型,它们只能由C++或编译器特定的定义来定义。
因此,唯一的问题是:这些typedefs是否比long long
大?所有的积分类型都可以转换为更大或大小相等的类型(尽管有符号/无符号,但这里的所有类型都是有符号的,所以没有问题)。但如果它更大。。。你打算怎么办?
假设您无法更改要"注入"的函数的签名(因为如果可以,就没有理由不将streamsize
作为参数类型,从而避免问题),那么您就没有任何选择。您的数据值大于函数的值。这里没有办法绕过它。
您可以对long long
执行static_cast以关闭编译器,但如果实际大小无法容纳long long
,这将没有帮助。
归根结底,这是一个棘手的问题。您有一个函数,它接受的参数对于您传递的内容来说可能太小了。您所能做的最多的事情就是通过static_assert
检测何时可能出现问题。类似这样的东西:
static_assert(sizeof(std::streamsize) <= sizeof(long long), "Oops.");
老实说,我并不担心。long long
很可能是编译器本机支持的最大整数大小。
只需将值传递给任何需要long-long的函数。std::streamoff
和std::streamsize
都是有符号积分类型,并且std::streampos
可以隐式转换为std::streamoff
。
edit:我想断言streamsize/streamoff不大于long long
不会有什么影响,以防有人提出__int128文件大小。
MINGW-64的短响应:std::streampos
具有将64位有符号整数类型std::streamoff
转换为的转换运算符
std::streampos pos = ...;
std::streamoff ofs = (std::streamoff) pos;
因此,例如,要查找文件的长度,只需打开std::ifstream
并评估。。。
static unsigned long long getStreamSize(std::ifstream& is)
{
std::streampos savePos = is.tellg();
is.seekg(0, std::ios::end);
std::streampos endPos = is.tellg();
is.seekg(savePos);
return (std::streampos)endPos;
}
或者认为STL是另一个岛屿。。。
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 关于std::move的使用,是否有编译警告
- 通过网络、跨平台传递std::变体是否安全
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- std::vector::迭代器是否可以合法地作为指针
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 是否将std::packaged_task添加到现有线程
- C++中是否存在 std::conditional 的懒惰等价物?
- 检查某些类型是否是模板类 std::optional 的实例化
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- "std::list::splice(std::const_iterator pos, std::list&& other)"是否保证将"其他"留空?
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- "using namespace std;"是否免于过多代码规则?
- GCC 或 Clang '-std=' 是否有任何"moving target"别名值,表示"use the latest standard"?