簡體   English   中英

如何使用預處理器識別Linux上的64位版本?

[英]How to identify a 64 Bit build on Linux using the preprocessor?

我即將將Windows 32位應用程序移植到64位,但可能決定稍后將整個程序移植到Linux。

代碼包含的部分取決於應用程序可用的內存量(這取決於我是否正在創建32位或64位版本),而編譯32位版本的代碼的能力應該保留為后向兼容性。

在Windows上,我可以簡單地將相應的代碼段包裝到預處理器語句中,以確保編譯正確的代碼版本。

不幸的是,我在Linux平台上編程的經驗很少,所以問題出現了:

我如何在Linux平台上識別64位版本?

是否有任何(最好是非編譯器特定的)預處理器定義我可以檢查這個?

提前致謝!

\\比約恩

假設您正在使用最近的GNU GCC編譯器用於IA32(32位)和amd64(非Itanium 64位目標用於AMD64 / x86-64 / EM64T / Intel 64),因為很少有人需要不同的Linux編譯器(英特爾和PGI)。

有編譯器行開關(可以在Makefile中添加到CFLAGS)-m64 / -m32來控制構建目標。

對於條件C代碼:

#if defined(__LP64__) || defined(_LP64)
#define BUILD_64   1
#endif

要么

#include <limits.h>
#if ( __WORDSIZE == 64 )
#define BUILD_64   1
#endif

雖然第一個是GCC特定的,但第二個更容易攜帶,但在一些我無法想到的奇怪環境中可能不正確。

目前兩者都應該正確地適用於IA-32 / x86(x86-32)和x86-64 / amd64環境。 我認為它們適用於IA-64(安騰)。

另請參閱GCC開發者峰會上的Andreas Jaeger的論文題為“ 移植到64位GNU / Linux系統” ,其中詳細介紹了64位Linux環境。

根據GCC手冊

__LP64__

_LP64

這些宏定義為值1,if(且僅當)編譯是針對目標的,其中long int和指針都使用64位而int使用32位。

這就是你需要的,對嗎?

此外,你可以試試

#define __64BIT (__SIZEOF_POINTER__ == 8)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM