如何使用预处理器在Linux上识别64位构建?

4

我即将把一个Windows 32位应用程序移植到64位,但后来可能会决定将整个应用程序移植到Linux。

代码包含依赖于应用程序可用内存量的部分(这取决于我是否创建32位或64位版本),同时保留编译32位版本的能力以实现向后兼容。

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

不幸的是,我在Linux平台上的编程经验非常有限,所以问题出现了:

我如何在Linux平台上识别64位构建?

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

谢谢!

\Bjoern

2个回答

6
根据GCC手册: GCC Manual
__LP64__ _LP64 如果编译目标是长整型和指针都使用64位,且整型使用32位的情况下, 这些宏定义为1。
您需要的就是这个,对吧?
另外,您可以尝试:
#define __64BIT (__SIZEOF_POINTER__ == 8)

如果不是这样,Solaris CC也是一样的,如果没有定义_ILP32。我花时间查找了它,但DrJokepu比我更快地完成了它 :-( - Chris Huang-Leaver
你看看这个——一个提到了实际文档的答案! :) +1。 - j_random_hacker

6
假设您正在使用最新的GNU GCC编译器进行IA32(32位)和amd64(AMD64 / x86-64 / EM64T / Intel 64的非Itanium 64位目标)的IT技术,因为很少有人需要Linux的不同编译器(Intel和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(Itanium)上工作。

另请参阅Andreas Jaeger在GCC开发者峰会上的论文,题为“移植到64位GNU / Linux系统”,其中对64位Linux环境进行了更详细的描述。


8
有一个100%便携的替代方案:#if UINTPTR_MAX == 0xffffffff(32位)#else(假设为64位或测试其他可能性)。 - R.. GitHub STOP HELPING ICE
更具体地说,uintptr_t 在 C99 中是可选的。然而,Linux 似乎要求存在这种类型,以及:sizeof(void *) == sizeof(long) - Brett Hale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接