2012-10-08 187 views

回答

5

那么,就C++ 98/03而言,long long int。所以我假设你在问C++ 11。

streamsizestreamoff必须是整数类型的类型定义(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将是您的编译器本身支持的最大整数大小。

+0

除了exabytes文件大小的情况,在转换为long long int期间会出现问题吗? – Vincent

+0

@Vincent:不可以。整数类型可以被转换成一个更大(或相等大小)的整数类型,而没有问题。 –

+0

'streampos'隐式地转换为'streamoff',所以你可以将它传递给期望“long long”的东西。 'streampos'和'streamoff'之间的区别是支持有状态字符编码。 – Potatoswatter

1

只需将该值传递给任何需要很长时间的函数。 std::streamoffstd::streamsize都是有符号整数类型,并且std::streampos可以隐式转换为std::streamoff

编辑:我想有一个断言,如果有人想出__int128文件大小,streamsize/streamoff不会大于long long不会伤害。

相关问题