有没有一种标准方法可以在编译时确定系统是32位还是64位?

时间:2011-07-15 11:04:26

标签: c++ compilation 32bit-64bit

我需要设置 #ifdef - 检查条件编译。我想自动化该过程但不能指定目标OS /机器。有没有一种方法可以解析预编译器是在32位还是64位上运行?

(解释)我需要定义一个64位大小的类型。在64位操作系统上它很长,在大多数情况下它是很长的。

我发现this answer - 这是正确的方法吗?

[edit] a handy reference for compiler macros

8 个答案:

答案 0 :(得分:10)

您可以可靠地执行的唯一编译检查是sizeof(void*) == 8,x64为true,x86为false。这是一个constexpr,您可以将其传递给模板,但您可以忘记使用ifdef。没有与平台无关的方法来了解目标体系结构的地址大小(在预处理时),您需要向IDE询问一个。标准甚至没有地址大小的概念。

答案 1 :(得分:4)

宏没有没有标准语言支持来确定机器在预处理器阶段是64位还是32位。

答案 2 :(得分:4)

为了响应您的编辑,有一种“无宏的方式”来获得64位的类型。

如果您需要一个可以容纳64位的类型,那么#include <cstdint>并使用int64_tuint64_t。您也可以使用the Standard Integer Types provided by Boost

另一种选择是使用long long。它在技术上不是C ++标准的一部分(它将在C ++ 0x中),但几乎每个编译器都支持它。

答案 3 :(得分:2)

Boost吸收了旧的Predef项目。假设您只关心x86,那么您需要architecture macros,更具体地说是BOOST_ARCH_X86_32 / BOOST_ARCH_X86_64

如果您需要更广泛的检测(例如ARM64),请将相关宏添加到您的支票中,或检查您确实要检查的内容,例如

sizeof(void*) == 8

答案 4 :(得分:2)

我会查看跨平台库的源代码。这是一个相当大的部分。每对操作系统和编译器都有自己的一组定义。你可能会看到很少的图书馆:
http://www.libsdl.org/ \include\SDL_config*.h(少量文件)
http://qt.nokia.com/ \src\corelib\global\qglobal.h

答案 5 :(得分:1)

嗯,答案显然是针对特定操作系统的,所以你需要缩小你的要求。

例如,在Unix上uname -a通常会提供足够的信息来区分操作系统的32位版本和64位版本。

您的预编译器可以调用该命令。根据其输出,可以适当地设置编译器标志。

答案 6 :(得分:0)

我很想将代码中的检测提升出来并将其放入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

答案 7 :(得分:-2)

最简单的方法可能是比较intlong long的大小。您不能在预处理器中执行此操作,但可以在static_assert中使用它。

编辑:魔兽所有的负面投票。我更清楚地说明了我的观点。此外,由于MSVC的工作方式,似乎我应该提到'long long'而不是'long'。