c++ - std::streampos、std::streamoff 和 std::streamsize 到 long long int?

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

为了测量流的位置/偏移量/大小,标准指定了 std::streamposstd::streamoffstd::streamsize,但它们是实现定义的。

如何以安全且可移植的方式将这些类型转换为long long int? (例如测量文件大小并将其注入(inject)以 long long int 作为参数的函数中)

最佳答案

嗯,就 C++98/03 而言,没有 long long int。所以我假设你问的是 C++11。

streamsizestreamoff 必须是整数类型的 typedef(streampos 不是整数,因此您不会将其传递给任何需要一个long long)。由于整数类型是基本类型,它们只能由 C++ 定义或作为特定于编译器的定义。

因此,唯一的问题是:这些类型定义是否大于 long long?所有整数类型都可以转换为更大或相等大小的类型(尽管有符号/无符号,但这里的所有类型都是有符号的,所以没问题)。但如果它更大……你打算怎么办?

假设你不能改变你正在“注入(inject)”它的函数的签名(因为如果你可以,就没有理由不把 streamsize 作为参数类型,从而避免问题),你没有任何选择。您的数据值大于函数采用的值。这里没有办法绕过它。

您可以对 long long 执行 static_cast 以关闭编译器,但如果实际大小不能适合 long long,这将无济于事.

归根结底,这是一个棘手的问题。您有一个函数接受一个参数,该参数对于您传递的内容来说可能太小了。您最多可以通过 static_assert 检测何时可能出现问题。像这样:

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

老实说,我不担心。 long long 很有可能成为您的编译器 native 支持的最大整数大小。

关于c++ - std::streampos、std::streamoff 和 std::streamsize 到 long long int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12774038/

相关文章:

c++ - Qt C++ 隔离键盘

c++ - 在 MOCK_METHOD 中匹配多个对象

c++ - 矩阵乘法速度问题

c# - 按 block 而不是逐行读取一个非常大的文件

javascript - 在node.js中使用tcp发送大文件但收到损坏的文件

c++ - std::initializer_list 返回值的生命周期

C++ 需要解释这个函数

java - 将 ArrayList 拆分为多个 ArrayList

c++ - 为什么这个函数在给定右值参数的情况下返回一个左值引用?

c++ - 编译器模板实现会引入循环依赖吗?