Vin*_*ent 7 c++ file standards-compliance stream c++11
为了测量流的位置/偏移/尺寸,标准指定std::streampos,std::streamoff和std::streamsize,但它们是实现定义.
如何以long long int安全和便携的方式转换这些类型?(例如,测量文件大小并将其注入一个以long long int作为参数的函数)
那么,就C++ 98/03而言,没有 long long int.所以我假设你在问C++ 11.
在streamsize和streamoff需要是一个整数类型的类型定义(streampos不是整数,这样你就不会被传递一个到任何需要long long).由于整数类型是基本类型,因此它们只能由C++或特定于编译器的定义定义.
因此,唯一的问题是:在这些类型定义较大的比long long?所有整数类型都可以转换为更大或相同大小的类型(尽管有符号/无符号,但这里的所有类型都是有符号的,所以没问题).但如果它更大......你打算怎么做呢?
假设你无法改变你正在"注入"它的功能的签名(因为如果你可以,没有理由不把它streamsize作为参数类型,从而避免问题),你没有任何选择.您的数据值大于函数所需的数据值.这里无法绕过它.
您可以执行一个static_cast long long来关闭编译器,但是如果实际大小不适合,那么这将无济于事long long.
最终,这是一个棘手的问题.你有一个函数,它接受的参数可能太小而不能传递.你能做的最多的事情是通过a检测它何时可能是一个问题static_assert.像这样的东西:
static_assert(sizeof(std::streamsize) <= sizeof(long long), "Oops.");
Run Code Online (Sandbox Code Playgroud)
说实话,我不担心.赔率很高,这long long将是您的编译器本身支持的最大整数大小.
| 归档时间: |
|
| 查看次数: |
12998 次 |
| 最近记录: |