是否有一个C宏或某种方式,我可以检查我的c程序是否在C编译时编译为64位或32位?
编译:GCC 我需要进行检查的操作系统:Unix / Linux
如果操作系统能够支持64位,我怎样才能检查运行我的程序?
答案 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 x86和AMD64。
例如:
#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;
}