在編寫應該可在32位和64位計算機上移植的代碼時應該記住哪些要點?要考慮編寫可移植到32位和64位體系結構的代碼的要點
思考更多關於這一點,我覺得如果你能interms面臨問題,這將有助於增加你的經驗。
這個雪上加霜的是,有一次我遇到一個問題,由於缺少原型爲其返回返回一個指針的函數。當我將它移植到一臺64位機器上時,代碼崩潰了,我不知道相當一段時間的原因,後來才意識到所有丟失的原型都被假定返回int來引起問題。
任何這樣的例子都可以提供幫助。
編輯:添加到社區wiki。
在編寫應該可在32位和64位計算機上移植的代碼時應該記住哪些要點?要考慮編寫可移植到32位和64位體系結構的代碼的要點
思考更多關於這一點,我覺得如果你能interms面臨問題,這將有助於增加你的經驗。
這個雪上加霜的是,有一次我遇到一個問題,由於缺少原型爲其返回返回一個指針的函數。當我將它移植到一臺64位機器上時,代碼崩潰了,我不知道相當一段時間的原因,後來才意識到所有丟失的原型都被假定返回int來引起問題。
任何這樣的例子都可以提供幫助。
編輯:添加到社區wiki。
陷阱:
一些技巧&技巧我發現有幫助:
typedef
你自己的),並使用它時,你有沒有變數關心大小。在Windows上,僅呼籲在x64約定,而不是將M在普通的x32機器上重複使用。
當你有一些32位和64位的組件時,事情會變得更加混亂。在Windows上,我最終寫了一個COM服務讓他們說話。
編寫自動化測試並在兩個平臺上定期運行測試。
sizeof(int)might!= sizeof(void *)
alignment。對齊需求可能會發生變化。這可以暴露錯誤的地方,如果接受者期待指針,則不應該將0傳遞給可變參數。如果接收者期待指針,則可以將0忽略到應該已經對齊的對象中,但僅在32位(或者在不關心的處理器上)這在C++中很痛苦,在這種情況下,精明的開發人員知道0是一個有效的空指針。 C開發人員通常會使用NULL,因此您可能確定
+1現在我想知道如果這種行爲是合規的。該標準說空值計算爲0.它不應該被默認提升爲(void *)嗎?不是你不應該使用NULL,而是閱讀標準,頭文件編寫者可以將NULL定義爲0. http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1425.pdf請參閱point 3對6.3.2.3。這聽起來像GCC是錯誤的,或者一旦這是目前的標準將是錯誤的。 – jbcreix 2010-02-12 23:07:14
在我的情況下,gcc將NULL轉換爲nullptr。所以它工作。我同意,如果NULL被定義爲0,那麼它不會修復我的錯誤,在這種情況下,我將不得不明確地說(void *)0 – pm100 2010-02-13 00:43:05
社區wiki? – jamessan 2010-02-12 18:40:20
請參閱http://stackoverflow.com/questions/411798/converting-32-bit-application-into-64-bit-application-in-c – Christoph 2010-02-12 18:42:29
和http://stackoverflow.com/questions/534941/team-is -XP32-to-xp64-for-net-development-any-gotchas/535154#535154 – lsalamon 2010-02-12 18:46:41