2012-10-08 205 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不會傷害。

相關問題