在C中检测64位编译

时间:2011-03-11 12:22:36

标签: c linux unix gcc

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

编译:GCC 我需要进行检查的操作系统:Unix / Linux

如果操作系统能够支持64位,我怎样才能检查运行我的程序?

8 个答案:

答案 0 :(得分:36)

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

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

答案 1 :(得分:23)

这是正确且可移植的测试,它不假设x86或其他任何东西:

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

答案 2 :(得分:11)

一个容易使语言律师得以解决的问题。

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

由于它是一个常量表达式,优化编译器将丢弃测试并仅将正确的代码放入可执行文件中。

答案 3 :(得分:5)

Use a compiler-specific macro.

我不知道你所针对的是什么架构,但由于你没有指定它,我会假设一般的英特尔机器,所以很有可能你有兴趣测试Intel x86AMD64

例如:

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

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

答案 4 :(得分:4)

一个编译器和平台无关的解决方案是这样:

public class ModelMock
    {
        public static ModelMock SaveSettingsModel()
        {
            return new ModelMock
            {

                matchActionsReasons =new List<MatchActionsReason>
                {    

                         name = "False positive",  **//Geting the error here**
                         value  = -2147483648      **//Geting the error here**
                }

            };

        }

        public class MatchActionsReason
        {
            public string name { get; set; }
            public int value { get; set; }
        }


            public List<MatchActionsReason> matchActionsReasons { get; set; }

    }

避免以一个或多个下划线开头的宏。它们不是标准的,可能在您的编译器/平台上不存在。

答案 5 :(得分:1)

GLIBC本身使用它(在inttypes.h中):

#if __WORDSIZE == 64

答案 6 :(得分:0)

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

所以,仅仅通过查看源代码,如果它是好的,你就无法分辨它是如何编译的。如果源不是那么好,可能猜测程序员假设将用它来编译它。

我给你的答案是:

有一种方法可以检查源文件仅用于坏程序所需的位数。

您应该努力使您的程序无论编译多少位都能正常工作。

答案 7 :(得分:0)

使用此 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;
}