如何使用预处理器识别Linux上的64位版本?

Bjo*_*ern 3 c linux 64-bit build

我即将将Windows 32位应用程序移植到64位,但可能决定稍后将整个程序移植到Linux.

代码包含的部分取决于应用程序可用的内存量(这取决于我是否正在创建32位或64位版本),而编译32位版本的代码的能力应该保留为后向兼容性.

在Windows上,我可以简单地将相应的代码段包装到预处理器语句中,以确保编译正确的代码版本.

不幸的是,我在Linux平台上编程的经验很少,所以问题出现了:

我如何在Linux平台上识别64位版本?

是否有任何(最好是非编译器特定的)预处理器定义我可以检查这个?

提前致谢!

\比约恩

mct*_*ylr 6

假设您正在使用最近的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
Run Code Online (Sandbox Code Playgroud)

要么

#include <limits.h>
#if ( __WORDSIZE == 64 )
#define BUILD_64   1
#endif
Run Code Online (Sandbox Code Playgroud)

虽然第一个是GCC特定的,但第二个更容易携带,但在一些我无法想到的奇怪环境中可能不正确.

目前,两者都应该正确地适用于IA-32/x86(x86-32)和x86-64/amd64环境.我认为它们适用于IA-64(安腾).

另请参阅GCC开发者峰会上的Andreas Jaeger的论文题为" 移植到64位GNU/Linux系统",其中详细介绍了64位Linux环境.

  • 有一个100%的便携式替代品:`#if UINTPTR_MAX == 0xffffffff`(32bit)`#else`(假设为64bit或测试其他可能性). (8认同)

Tam*_*ege 5

根据GCC手册:

__LP64__

_LP64

这些宏定义为值1,if(且仅当)编译是针对目标的,其中long int和指针都使用64位而int使用32位.

这就是你需要的,对吗?

此外,你可以试试

#define __64BIT (__SIZEOF_POINTER__ == 8)
Run Code Online (Sandbox Code Playgroud)