您可以可靠地进行的唯一编译检查是 sizeof(void*) == 8
,对于 x64 为真,对于 x86 为假。 这是一个constexpr,您可以将其传递给模板,但是不要忘记与之一起使用ifdef。没有平台无关的方法可以在预处理时知道目标体系结构的地址大小,您需要向IDE请求。标准甚至没有地址大小的概念。
在预处理阶段,宏无法确定计算机是64位还是32位,因此没有标准语言支持。
我建议查看跨平台库的源代码。这是一个相当大的部分。每个操作系统和编译器的组合都有自己的一套定义。以下是几个值得注意的库:
http://www.libsdl.org/ \include\SDL_config*.h
(几个文件)
http://qt.nokia.com/ \src\corelib\global\qglobal.h
嗯,答案显然会与操作系统有关,因此您需要缩小您的要求范围。
例如,在Unix上,uname -a
通常提供足够的信息来区分32位操作系统构建和64位操作系统构建。
该命令可以被您的预处理器调用。根据其输出,可以适当地设置编译器标志。
gcc -dM -E - < /dev/null
命令中的符号。 - lhf我会想把检测代码提取出来放到 Makefile 中。这样,你就可以利用系统工具来检测并设置适当的宏,以便在代码中进行切换。
在你的 Makefile 中...
<do stuff to detect and set SUPPORT_XX_BIT to the appropriate value>
gcc myFile.c -D$(SUPPORT_XX_BIT) -o myFile
#if defined(SUPPORT_32_BIT)
...
#elif defined(SUPPORT_64_BIT)
...
#else
#error "Select either 32 or 64 bit option\n"
#endif
可能最简单的方法是比较 int
和 long long
的大小。虽然你不能在预处理器中这样做,但你可以在 static_assert
中使用它。
编辑:哇,所有的负评。我把我的观点表达得更清楚了。此外,由于 MSVC 的工作方式,我应该提到 'long long' 而不是 'long'。
static_assert
。 - AlefSinint
和long
通常具有相同的大小。 - Oliver Charlesworth