Ano*_*mie 35
既然你标记了这个"gcc",试试吧
#if __x86_64__
/* 64-bit */
#endif
Run Code Online (Sandbox Code Playgroud)
R..*_*R.. 25
这是正确的便携式测试,它不假设x86或其他任何东西:
#include <stdint.h>
#if UINTPTR_MAX == 0xffffffff
/* 32-bit */
#elif UINTPTR_MAX == 0xffffffffffffffff
/* 64-bit */
#else
/* wtf */
#endif
Run Code Online (Sandbox Code Playgroud)
Pat*_*ter 11
一个容易使语言律师得到解决的问题.
if(sizeof (void *) * CHARBIT == 64) {
...
}
else {
...
}
Run Code Online (Sandbox Code Playgroud)
由于它是一个常量表达式,优化编译器将丢弃测试并仅将正确的代码放入可执行文件中.
编译器和平台中立的解决方案是这样的:
// C
#include <stdint.h>
// C++
#include <cstdint>
#if INTPTR_MAX == INT64_MAX
// 64-bit
#elif INTPTR_MAX == INT32_MAX
// 32-bit
#else
#error Unknown pointer size or missing size macros!
#endif
Run Code Online (Sandbox Code Playgroud)
避免以一个或多个下划线开头的宏。它们不是标准的,可能会在您的编译器/平台上丢失。
我不知道您的目标是什么架构,但由于您没有指定它,我将假设一般的英特尔机器,因此您很可能对测试Intel x86和AMD64感兴趣.
例如:
#if defined(__i386__)
// IA-32
#elif defined(__x86_64__)
// AMD64
#else
# error Unsupported architecture
#endif
Run Code Online (Sandbox Code Playgroud)
但是,我更喜欢将它们放在单独的头文件中并定义我自己的编译器中立宏.
| 归档时间: |
|
| 查看次数: |
34630 次 |
| 最近记录: |