2012-10-09 57 views
9

我正在將應用程序移植到Linux平臺上的64位。該應用程序目前支持Linux,Windows,Mac 32位和Windows 64位。我們經常遇到的一個問題是int對long的使用,反之亦然。直到現在,這並不是一個問題,因爲long和int在應用程序當前支持的平臺上可以互換(都是4個字節)。該代碼庫是一個巨大的代碼庫,有許多遺留代碼用於許多數據類型的#defines,因此搜索long的所有用法並用int進行適當替換會很麻煩。在64位Linux機器上在gcc中創建'long'4字節

  1. 作爲一個短期的解決方案,有沒有辦法讓GCC使用4個字節而不是8個'long'?
  2. 如果有,我們可能會遇到什麼問題?如果沒有,是否有更簡單的方法來解決長期和整數問題?
+5

這不是解決您的直接問題(因此評論),但對於未來的代碼,我會使用確切的寬度類型來代替(例如'uint32_t')。 –

回答

6
  1. 號在Linux x86_64上ABI指定長是8個字節的類型(LP64)。實際上,如果不是所有的64位Unix系統(包括64位OS X,AFAIK),大多數都是LP64,所以這不是Linux特有的。

  2. 除了修復你的代碼,沒有。

如果你需要一個便攜式的整數類型是大到足以存儲一個指針值,使用intptr_t和uintptr_t的(但通常想要存儲指針值轉換成整數意味着你正在做的事情錯了,所以請三思!)。對於能夠表示兩個指針之間差異的整數類型,請使用ptrdiff_t。對於對象的大小,請使用size_t。

+0

如果運行時庫是靜態鏈接的,ABI不應該關心編譯器調用哪種類型的「long」,前提是任何外部庫原型都是使用固定寬度類型定義的,而編譯器不會去做煩人的具有相同表示但不匹配類型的別名。 – supercat

5

-m32生成32位代碼。

-mx32生成64位代碼,但使用32位長和指針。

Intel 386 and AMD x86-64 Options

+0

但是如何與使用64位長的系統庫進行交互? – johv

+0

原始的海報似乎需要很長的32位,所以他們需要鏈接到32位數據的庫。我認爲,當一個函數被調用時,當它需要一個32位參數時,它不關心調用者的數據類型,也不關心調用者是否是C函數。但是,是的,調用者必須確保不要調用期望64位值的庫。 –

+2

@johv:不會的。使用-m32時,需要使用具有「常規」32位x86 ABI的庫,使用-mx32則需要X32庫。 – janneb

相關問題