mta*_*c85 5 c architecture cpu gcc clang
正如标题所说,有没有任何优雅和安全的方法来确定架构是32位还是64位.通过优雅,您可以想到精确,正确,简短,干净和智能的方式.安全,从标准,C89/C99和操作系统独立性的角度考虑安全.
简短的回答:没有
答案很长:它取决于太多的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为您的平台搜索编译时间,但这是一个众所周知的混乱.
如果您正在使用GCC(如标签中所示),您可以测试,作为编译时测试
#if __SIZEOF_POINTER__ == 8
Run Code Online (Sandbox Code Playgroud)
找出它是否是64位系统.__SIZEOF_POINTER__在使用之前,请确保您使用的GCC版本完全定义.
指针的大小实际上并不是一个值得测试的好东西——无论如何,在标准 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 的区域是没有意义的。)