优雅而安全的方法来确定架构是32位还是64位

mta*_*c85 5 c architecture cpu gcc clang

正如标题所说,有没有任何优雅和安全的方法来确定架构是32位还是64位.通过优雅,您可以想到精确,正确,简短,干净和智能的方式.安全,从标准,C89/C99和操作系统独立性的角度考虑安全.

dfa*_*dfa 9

简短的回答:没有

答案很长:它取决于太多的OS /编译器组合.例如,在运行时,在linux上,您可以查询proc文件系统,而在Windows上,您可以查询寄存器.

您可以使用以下内容证明用于编译的编译器具有32/64位目标:

bool is_32bit() {
    return sizeof(int *) == 4;
} 

bool is_64bit() {
    return sizeof(int *) == 8;
} 
Run Code Online (Sandbox Code Playgroud)

这可以在几个假设下工作(例如它在运行时工作).您可以#define为您的平台搜索编译时间,但这是一个众所周知的混乱.

  • "此外,布尔没有任何C标准." - false,它符合<stdbool.h>中的C99标准 - http://en.wikipedia.org/wiki/Stdbool.h (5认同)

Mar*_*wis 8

如果您正在使用GCC(如标签中所示),您可以测试,作为编译时测试

#if __SIZEOF_POINTER__ == 8
Run Code Online (Sandbox Code Playgroud)

找出它是否是64位系统.__SIZEOF_POINTER__在使用之前,请确保您使用的GCC版本完全定义.


caf*_*caf 3

指针的大小实际上并不是一个值得测试的好东西——无论如何,在标准 C 中你可以利用该测试的结果做的事情并不多。

我的建议是 test ((size_t)-1),C 可以理解的最大对象大小:

    if ((size_t)-1 > 0xffffffffUL)
    {
            printf("> 32 bits\n");
    }
    else
    {
            printf("<= 32 bits\n");
    }
Run Code Online (Sandbox Code Playgroud)

如果它大于那么0xffffffffUL 原则上你可以拥有大于2**32 - 1字节的对象,这似乎是一个比模糊的“32 位与 64 位”更有意义的测试。

(例如,如果您知道 的最大值size_t仅为2**32 - 1,则尝试mmap()大于 1 或 2 GB 的区域是没有意义的。)