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

问题描述 投票:7回答:8

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

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

我找到了this answer - 这是正确的方法吗?

[编辑]一个handy reference for compiler macros

c++ compilation 32bit-64bit
8个回答
10
投票

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


4
投票

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


4
投票

为了响应您的编辑,有一个“宏 - 少你自己”的方式来获得64位的类型。

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

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


2
投票

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


2
投票

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

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

sizeof(void*) == 8

1
投票

好吧,答案显然是特定于操作系统,因此您需要缩小您的要求。

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

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


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

-2
投票

可能最简单的方法可能是比较intlong long的大小。你不能在预处理器中做到这一点,但你可以在static_assert中使用它。

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

© www.soinside.com 2019 - 2024. All rights reserved.