【问题标题】:Is there a standard way to determine at compile-time if system is 32 or 64 bit?是否有一种标准方法可以在编译时确定系统是 32 位还是 64 位?
【发布时间】:2011-10-06 01:43:15
【问题描述】:

我需要设置 #ifdef - 检查条件编译。我想自动化这个过程,但不能指定目标操作系统/机器。有没有办法让预编译器解析它是运行在 32 位还是 64 位上?

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

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

[编辑] handy reference for compiler macros

【问题讨论】:

  • 您对 64 位系统的具体定义是什么? (这是一个严肃的问题)
  • 为什么它对你的程序很重要?
  • 那么,如果编译器运行在 32 位机器上,您希望代码将代码编译为 32 位,还是如果编译器运行在 64 位机器上,则编译为 64 位?我不太明白你的问题。我也很难相信你不能指定目标操作系统/机器,特别是如果你是编译源代码的人。
  • 预编译器中目标系统的“位数”没有标准定义。您要么必须传递自己的,要么依赖编译器本身定义的那些。例如。 _WIN64

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


【解决方案1】:

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

【讨论】:

  • 很好的建议重新模板,我认为这是最安全的方式。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    作为对您的编辑的回应,有一种“适合您的无宏”方式来获取 64 位类型。

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        sizeof(void*) == 8
        

        【讨论】:

        • 这是仅链接答案的问题:链接已失效,我不知道如何使用此“答案”解决我的问题。
        【解决方案6】:

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

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

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

        【讨论】:

        • 这也不是编译时检查
        • 或者使用gcc -dM -E - < /dev/null中的符号。
        【解决方案7】:

        我很想从代码中提取检测并将其放入 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
        

        【讨论】:

          【解决方案8】:

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

          编辑:魔兽世界所有的反对票。我把我的观点说得更清楚了。此外,由于 MSVC 的工作方式,我似乎应该提到“long long”而不是“long”。

          【讨论】:

          • 也许您的意思是 INT_MAX 和 LONG_MAX?
          • 在 MSVC 上,int 和 long 在 64 位目标上都是 32 位。
          • @Oli:是的,我知道你不能将 sizeof 与预处理器一起使用。我在想更多关于static_assert
          • @AlefSin:我的抱怨更多是基于intlong 通常大小相同。
          猜你喜欢
          • 1970-01-01
          • 2015-06-06
          • 2011-05-04
          • 2012-03-02
          • 1970-01-01
          • 2012-04-15
          • 1970-01-01
          • 1970-01-01
          • 2010-12-29
          相关资源
          最近更新 更多