在C中检测64位编译

有没有一个Cmacros或某种方式,我可以检查我的C程序编译时在C编译为64位或32位?

编译器:GCC操作系统,我需要做的检查:Unix / Linux

另外我怎么能检查当运行我的程序,如果操作系统是64位的能力?

Solutions Collecting From Web of "在C中检测64位编译"

由于您标记了这个“gcc”,请尝试

#if __x86_64__ /* 64-bit */ #endif 

这是正确和便携式的测试,不承担x86或其他任何东西:

 #include <stdint.h> #if UINTPTR_MAX == 0xffffffff /* 32-bit */ #elif UINTPTR_MAX == 0xffffffffffffffff /* 64-bit */ #else /* wtf */ #endif 

一个简单的,将使语言律师simingem。

 if(sizeof (void *) * CHARBIT == 64) { ... } else { ... } 

由于它是一个常量表达式,所以优化编译器将会放弃测试,只将正确的代码放在可执行文件中。

看看下面的问题 。 它概述了__LP__ gcc预处理器指令的使用

使用编译器特定的宏。

我不知道你的目标架构是什么,但是由于你没有详细说明,所以我会假设一般的英特尔机器,所以很有可能你有兴趣测试英特尔x86和AMD64 。

例如:

 #if defined(__i386__) // IA-32 #elif defined(__x86_64__) // AMD64 #else # error Unsupported architecture #endif 

不过,我更喜欢把它们放在单独的头文件中,并定义我自己的编译器中立的宏。

这取决于您的操作系统/环境。 对于Mac OS X,请参阅如何知道当前的体系结构是否在mac中为i386或x86_64? (Xcode中)

在64位计算机,32位计算机,36位计算机中可以(也应该能够)编译相同的程序源…

所以,只要看资料来源,如果有什么好的,你不能说出它是如何被编译的。 如果来源不是那么好,那么可以猜测程序员认为用什么来编译它。

我对你的回答是:

有一种方法可以检查只有不良程序的源文件所需的位数。

你应该努力让你的程序工作,不管他们将被编译多少位。

查看预定义的C / C ++编译器宏 ,这是一个由标准,编译器,库,操作系统以及您的问题体系结构预定义的宏的参考。

GLIBC本身使用这个( inttypes.h ):

 #if __WORDSIZE == 64 

使用这个UINTPTR_MAX值来检查构建类型。

 #include <stdio.h> #include <limits.h> #if UINTPTR_MAX == 0xffffffffffffffffULL # define BUILD_64 1 #endif int main(void) { #ifdef BUILD_64 printf("Your Build is 64-bit\n"); #else printf("Your Build is 32-bit\n"); #endif return 0; } 

这个问题是不明确的,因为它没有指定要求是用于64位指针还是64位本地整数算术 ,或者两者兼有。

其他一些答案已经指出如何检测64位指针。 即使这个问题字面上规定“编译为”,注意这并不能保证有一个64位的地址空间可用。

对于许多系统来说,检测64位指针就相当于检测到64位算术没有被仿真,但是对于所有的潜在情况并不能保证。 例如,虽然Emscripten使用最大尺寸为2 32 -1的 Javascript数组来模拟内存,但为了提供兼容性来编译针对64位的C / C ++代码,我相信Emscripten 对于限制是不可知的 (虽然我还没有测试过这个)。 然而,不管编译器规定的限制,Emscripten总是使用32位算术 。 所以看起来Emscripten会采用针对64位int和64位指针的LLVM字节码,并将其模拟为Javascript的最佳功能。

我原先建议检测64位“本地”整数如下,但正如帕特里克Schlüter指出,这只能检测到ILP64的罕见情况 :

 #include <stdint.h> #if UINT_MAX >= 0xffffffffffffffff // 64-bit "native" integers #endif 

所以,正确的答案是,一般来说,你不应该根据编译器报告的限制值对模糊的“64位”分类的地址空间或算术效率做任何假设。 您的编译器可能支持特定数据模型或微处理器体系结构的非便携式预处理器标志,但考虑到GCC和Emscripten场景(其中Clang模拟GCC)的问题,即使这些可能会引起误解(虽然我没有测试过)。

一般来说,这些场景都不能被用来给出64位地址空间和非模拟64位算法是否可用的可靠指示,因此它们基本上对于所述属性是无用的(除了在上下文中一个不可知的构建系统。 因此,对于所述属性 ,最好设置构建宏,以便构建系统可以选择编译哪个变体。