gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:36:06 31 4
gpt4 key购买 nike

为了测量流的位置/偏移量/大小,标准指定了 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com