2015-10-15 12 views
0

我的模塊將用於x86和x64環境。我有一個頭文件,包含帶有以下簽名的導出函數。我應該使用什麼類型來定義接口中的緩衝區大小?

HRESULT GetObject(DWORD key, void* pValue, MY_SIZE_T cbSize); 

我應該使用什麼類型的類型MY_SIZE_T

  1. 使用std::size_t來描述由pValue指向的對象的大小。但是std :: size_t在x86和x64平臺上有所不同。我不確定它在界面級別上沒問題。

  2. 使用具有固定寬度的DWORD。但DWORD在x64平臺上可能不夠大。雖然很少有超過2^32字節的結構。

+1

考慮使用'uint64_t',雖然它可能未在某些平臺上定義 –

+0

您打算一次編譯此代碼並在兩個平臺上使用相同的*二進制代碼*嗎?我會想象,在size_t的大小成爲問題之前,你會遇到很多其他問題。 –

+0

@KerrekSB Nope。我將在兩個x86平臺上編譯代碼,一個用於x64。 –

回答

3

這取決於cbSize應該包含的內容。如果它實際上是由pValue指向的對象的大小,那麼std::size_t絕對是正確的選擇。

std::size_t保證存在,並保證足夠大以保持對象的大小。如果你有64位指針,它將至少有64位,如果你有32位指針,那麼它將(可能)只有32位。

請注意,二進制兼容性可能不在此處。如果你有一個32位系統並且爲此編譯,那麼無論如何你都不能將它與爲64位系統編譯的代碼鏈接起來。第三個參數的大小不一樣是沒有問題的(如果是這樣的話,那麼你會對指針有任何問題)。