2013-02-26 150 views
3

http://msdn.microsoft.com/en-us/library/windows/desktop/aa384242%28v=vs.85%29.aspx澄清:移植32到64位

使用UINT_PTR和INT_PTR在適當情況下(如果你不確定 無論他們是必需的,但更是在短短的 情況下使用它們沒有傷害)報價。不要將指針指向ULONG,LONG,INT,UINT, 或DWORD類型。

我可以安全地假設在現有的32位Codeline中將所有引用的DWORD轉換爲UNIT_PTR是安全的,沒有任何副作用?

是否還有其他推薦的指南來移植引用DWORD的32位代碼?

+0

等等,不,你誤解了。不要將所有'DWORD'轉換爲'UINT_PTR'! – 2013-02-26 19:04:58

+0

@MooingDuck:你爲什麼這麼認爲?你能解釋一下嗎? – Abhijit 2013-02-26 19:11:22

+4

(1)只有在需要將指針存儲在整數類型變量中時才使用'UINT_PTR'。否則使用整數或指針。 (2)'UINT_PTR'有時候會是32位,有時候是64位,大多數情況下,你不需要它。 (3)由於它破壞了二進制的兼容性和可移植性,這取決於你如何完成你的IO,它可能會使你的數據不可移植。 – 2013-02-26 19:19:38

回答

6

這太粗暴了。只要讓編譯器爲你做好工作,啓用警告4302,它會告訴你指針值何時被截斷。將#pragma放在一個合適的位置,預編譯的頭文件將是理想的。或者指定/we4302編譯器選項。

#pragma warning(default:4302) 

int main() 
{ 
    int* p = 0; 
    long bad = (long)p; // C4302: 'type cast' : truncation from int* to long 
    return 0; 
} 

的/ Wp64編譯選項可以是有用的,對於一嗅,無論如何,但它has problems

+0

+1:'這太粗暴了',但這聽起來對我來說是最實際的解決方案 – Abhijit 2013-02-26 19:53:35

+0

你的回答是最實際的。我在我的構建系統中添加/ we4302,現在正在努力修復遺留的罪惡 – Abhijit 2013-03-02 15:25:37

2

如果您打算在變量(包括各種形式的HANDLE)中存儲指針,則只需要使用INT_PTRUINT_PTR。如果它只是一個常規的整數值,那麼它就沒有關係。

如果您將所有DWORD盲目翻譯爲UINT_PTR,我預計至少會出現一些「嘗試以較小類型存儲較大類型」的警告。 [也就是說,當你編譯64位代碼時,與32位代碼類似,UINT_PTR類型與DWORD相同,所以在這種情況下你可能不會收到任何警告]。

+0

所以我可以安全地得出結論,我可以將所有引用的DWORD轉換爲UINIT_PTR? – Abhijit 2013-02-26 19:03:33

+0

我認爲這就是我的回答:你不應該盲目地將每個DWORD轉換爲'UINT_PTR',因爲有可能出現'DWORD'正確的情況。當然,沒有看到你的代碼,我不知道,因爲我不知道你在用什麼'DWORD'。但是,在幾乎所有情況下,DWORD都不用於存儲指針,所以如果沒有其他指針,則會爲您的數據使用更多的空間。 – 2013-02-26 19:06:17

+0

'所以如果沒有其他的東西,你會使用更多的空間來存儲你的數據',是的,我明白了。但正如你所說,除了存儲指針之外,DWORD還有許多用途,如果我將所有DWORD盲目地轉換爲UNIT_PTR,除了使用更多空間之外,還會有其他含義嗎? – Abhijit 2013-02-26 19:10:58

1

上添加@MatsPetersson答案 -

原因DWORD被廣泛用於保存的地址是它在32位架構的指針大小相匹配。

最佳做法是爲變量保存地址使用專用類型。這就是UINT_PTR & INT_PTR適用於 - 它們對於32位和64位目標都是正確的,因爲它們的定義根據編譯目標正確設置。實際上,您可以瀏覽MS標題,並查看這些類型所對應的實際基本類型。

每當可變用於除地址以外的數據,實際的類型應根據所存儲的數據來定義,並且通常不會依賴於底層的計算機體系結構 - DWORD仍將DWORDWORD仍將WORD

+1

它當然不再被廣泛使用。這個狗屎是一個錯誤。 – Puppy 2013-02-26 19:23:54

+0

@DeadMG什麼是不廣泛使用?什麼是狗屎和什麼是錯誤? – SomeWittyUsername 2013-02-26 19:24:49