Boost C++ 库

...全球最受尊敬、设计最精妙的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ Coding Standards

Boost.Predef - Boost C++ 函数库

1. 引言

本库定义了一组编译器、架构、操作系统、库和其他版本号,这些信息是从 C、C++、Objective C 和 Objective C++ 的预定义宏或通用头文件中收集而来。这个库的构想源于一项扩展 Boost Config 库以提供比其支持的特性定义更丰富、更一致信息的提议。以下是该简短提案的编辑版本。

1.1. 提案

该构想是定义一组宏来标识编译器并一致地表示它们的版本。这包括:

  • 一个唯一的 `BOOST_VERSION_NUMBER(major,minor,patch)` 宏,用于指定版本号(不幸的是,`BOOST_VERSION` 这个名称已被用于指定 Boost 本身的版本号)。

  • 一个适用于每个支持编译器的 `#if`/`#elif` 指令的编译器标识宏。所有宏都将被定义,而不管编译器是什么。与当前使用的编译器对应的宏将根据 `BOOST_VERSION_NUMBER` 进行定义,以携带精确的编译器版本。所有其他宏将展开为一个求值为 false 的表达式(例如,令牌 `0`),以表明相应的编译器不存在。

  • 可以在 `boost/config/select_compiler.hpp` 中为所有宏设置“空值”,然后,对于每个编译器,在相应的 `boost/compiler/(cc).hpp` 中 `#undef` 并重新 `#define` 相应的标识宏;然而,在 Boost.Config 基础架构的上下文中,使用“前缀”头文件(待引入)或 `boost/config/suffix.hpp` 是更好的解决方案。

1.2. 当前库

现在的 Predef 库既是一个独立的库,其范围也有所扩大。它包括对架构、编译器、语言、库、操作系统和字节序的检测和定义。主要优点是:

  • 版本号始终定义,因此无需使用 `#ifdef` 进行保护。

  • 用于 `#ifdef` 检查的保护宏。

  • 所有可能的定义都包含在单个 `#include ` 中,因此有利于预编译头文件的使用。

  • 可以包含特定的定义,例如 `\#include ` 用于单个检查。

  • 预定义宏可以直接在预处理器和编译器表达式中使用,与其他类似定义的宏进行比较。

  • 这些头文件可供支持 C 预处理器的多种语言使用。特别是 C++、C、Objective C 和 Objective C++。

1.3. 设计选择

一个重要的设计选择是如何通过一个适用于预处理器指令的单一整数来表示编译器版本。我们来做一些计算。“基本”的有符号类型在 C90(以及 2006 年的 C++)中是 `long`,在 C99 中是 `intmax_t`。`long` 类型至少应能表示数字 `+2,147,483,647`。这意味着最高有效数字只能是 0、1 或 2;如果我们希望所有十进制数字都能在 0 到 9 之间变化,那么我们可以考虑的最大范围是 `[0, 999,999,999]`。平均分配,这意味着每个版本号部分有 3 位十进制数字。

所以我们可以:

  1. 使用不均匀的分配,或者

  2. 使用更多位数(更大的类型),或者

  3. 使用 3/3/3,并让特定的编译器/平台/stdlib 处理在 3 位数字范围内设置数字。

似乎相对安全的选择是第一种,将其设置为 2/2/5。这可以覆盖 CodeWarrior 等编译器,它们的次要版本号高达 10 甚至更高。有些编译器使用构建号代替补丁号;在这种情况下,五位数(VC++ 8 已达到)似乎也是一个合理的限制。

2/2/6 的方案将允许更大的补丁/构建号,但代价是,例如,主版本号限制为 20(或者,如果进一步限制,则为 21)。

为了让读者放心,这个决定实际上只在代码的一个地方进行了编码:`BOOST_VERSION_NUMBER` 的定义。

1.4. 未来工作

尽管本库的基础部分已经完成,但仍有大量工作可以进行:

  • 目前,我们仅限于检测已知的内置预定义宏以及保证存在的系统和库头文件。增加类似自动配置预定义宏可能会很有趣。这样我们就可以为用户特定的库和特性添加定义。

  • 与上述内容一样,最好添加一些用户控件,以便选择包含在顶级头文件中的头文件。尽管在库的当前形式下,这个问题不大,因为您可以包含所需的特定头文件。

  • 此外,即使没有自动配置风格的选项,也应该添加可选包含的头文件,以便用户能够获得他们使用的库的一致版本号定义。

  • 显然,还有很多工作要做,需要重构现有的 Boost 库以使用 Predef 库。

  • 并且,持续增加对当前和未来编译器、平台、架构、语言和库的定义也是一项持续的工作。

2. 使用预定义宏

要使用自动定义的预定义宏,您只需要包含单个顶级头文件:

#include <boost/predef.h>

这会定义 [*所有] 库已知的版本宏。对于每个宏,它将定义为当特定项未检测到时为一个“*零*”值表达式,当检测到时为一个“*正值*”。预定义宏分为五类,每类都有一个特定前缀的宏:

  • `BOOST_ARCH_` 用于编译的目标系统/ CPU 架构。

  • `BOOST_COMP_` 用于正在使用的编译器。

  • `BOOST_LANG_` 用于正在编译的语言标准。

  • `BOOST_LIB_C_` 和 `BOOST_LIB_STD_` 用于正在使用的 C 和 C++ 标准库。

  • `BOOST_OS_` 用于正在编译的目标操作系统。

  • `BOOST_PLAT_` 用于操作系统之上的平台或编译器。

  • `BOOST_ENDIAN_` 用于操作系统和架构组合的字节序。

  • `BOOST_HW_` 用于特定硬件功能。

  • `BOOST_HW_SIMD` 用于 SIMD(单指令多数据)检测。

检测到的定义是您在编译期间的目标配置。特别是在交叉编译中,这意味着目标系统,而不是主机系统。

您可以直接使用各个定义来与特定版本进行比较,方法是将其与 `BOOST_VERSION_NUMBER` 宏进行比较。例如,要根据 GCC C++ 编译器的版本做出选择,您会这样做:

#include <boost/predef.h>
#include <iostream>

int main()
{
  if (BOOST_COMP_GNUC >= BOOST_VERSION_NUMBER(4,0,0))
    std::cout << "GCC compiler is at least version 4.0.0" << std::endl;
  else
    std::cout << "GCC compiler is at older than version 4.0.0, or not a GCC compiler" << std::endl;
  return 0;
}

如您在上面注意到的,`else` 子句也涵盖了特定编译器未被检测到的情况。但是,您可以使测试也测试检测本身。所有预定义宏在未检测到时都定义为零(0)表达式。因此,您可以使用检测作为自然单条件。例如:

#include <boost/predef.h>
#include <iostream>

int main()
{
  if (BOOST_COMP_GNUC)
    std::cout << "This is GNU GCC!" << std::endl;
  else
    std::cout << "Not GNU GCC." << std::endl;
  return 0;
}

而且,由于预定义宏是预处理器定义,因此从预处理器也可以做到这一点:

#include <boost/predef.h>
#include <iostream>

#if BOOST_COMP_GNUC
  #if BOOST_COMP_GNUC >= BOOST_VERSION_NUMBER(4,0,0)
    const char * the_compiler = "GNU GCC, of at least version 4."
  #else
    const char * the_compiler = "GNU GCC, less than version 4."
  #endif
#else
  const char * the_compiler = "Not GNU GCC."
#endif

int main()
{
  std::cout << the_compiler << std::endl;
  return 0;
}

此外,对于定义的每个版本宏,都有一个 `*_AVAILABLE` 宏,仅在特定方面被检测到时定义。即,一个等效于:

#if BOOST_PREDEF_ABC
  #define BOOST_PREDEF_ABC_AVAILABLE
#endif

同样,对于每个方面,都有一个具有描述性名称的宏,说明检测的是什么。

2.1. `*_EMULATED` 宏

预定义宏在同一类别内保证能被唯一地检测。但在某些情况下,可能存在多个底层检测。一个众所周知的例子是 GCC 和 MSVC 编译器的检测,它们通常通过定义相同的基本宏来模拟。为了处理这种情况,允许检测头文件在检测到这种情况时定义 `*_EMULATED` 预定义宏。模拟的预定义宏将设置为检测的版本号,而不是该检测的常规预定义宏。例如,MSVC 将设置 `BOOST_COMP_MSVC_EMULATED` 但不设置 `BOOST_COMP_MSVC`,它还将设置 `BOOST_COMP_MSVC_AVAILABLE`。

2.2. 使用 `BOOST_VERSION_NUMBER` 宏

所有预定义宏都被定义为使用 `BOOST_VERSION_NUMBER` 宏。该宏接受单独的主版本、次版本和补丁版本表达式:

#define BOOST_VERSION_NUMBER( major, minor, patch ) ...

参数是:

  1. 主版本号,作为常量值表达式,范围为 [0,99]。

  2. 次版本号,作为常量值表达式,范围为 [0,99]。

  3. 补丁级别版本号,作为常量值表达式,范围为 [0,99999]。

每个范围是通过使用模运算(“%”)即截断来“强制”的,而不是钳位。这意味着限制只强制执行到足以避免越界问题,但不足以防止其他类型的问题。例如,超出范围导致错误的检测或非检测。个体预定义宏的正确使用取决于其超出范围保证。

参数值可以是任何预处理器有效的常量值表达式。`BOOST_VERSION_NUMBER` 宏的定义以及任何其他预定义宏的定义中只使用常量值算术。这意味着可以使用任何允许的基数,即二进制、八进制、十进制和十六进制。例如:

#define MY_APPLICATION_VERSION_NUMBER BOOST_VERSION_NUMBER(2,0xA,015)

等同于:

#define MY_APPLICATION_VERSION_NUMBER BOOST_VERSION_NUMBER(2,10,13)

3. 添加新的预定义宏

我们知道像这样的库将是一个永无止境的进行中的工作。因此,我们期望并期待其他人为预定义宏贡献修正和补充。考虑到这一点,我们需要保持定义新预定义宏的一致方式。因此,所有当前和未来的预定义宏都遵循相同的结构和要求。

3.1. 头文件的要求

所有预定义宏都需要遵循一套要求:

  • 头文件必须使用 Boost 软件许可证。

  • 默认情况下,预定义宏必须定义为 `BOOST_VERSION_NUMBER_NOT_AVAILABLE`。

  • 一旦检测到预定义宏,它必须重新定义为一个非零值。

  • 默认情况下,当检测到预定义宏时,它必须定义为 `BOOST_VERSION_NUMBER_AVAILABLE`。

  • 如果可能,预定义宏将定义为检测到的版本号。

  • 预定义宏必须根据需要定义 `*_AVAILABLE` 宏。

  • 预定义宏必须定义一个符号常量字符串名称宏。

  • 预定义宏必须在定义后,声明自己,供测试系统使用。

  • 预定义宏必须保证它是每个类别中唯一被定义为已检测到的宏。

  • 但是,预定义宏可以定义 `*_EMULATED` 宏,以表明它之前已被另一个头文件检测到,并且正在被系统“模拟”。请注意,在这种情况下,`*_AVAILABLE` 宏仍然必须被定义。

此外,还有一些额外的指导方针供预定义宏头文件遵循:

  • 检测应避免包含可能默认不包含的额外头文件。

  • 如果检测必须包含一个头文件,请尽可能将其包含在检测中进行保护。

  • 如果检测必须无条件包含头文件,并且可以选择包含的头文件,请优先选择影响最小的。即,包含具有最少定义集和其他依赖项的头文件。

3.2. 头文件的结构

为了普遍一致性,建议新的预定义宏头文件遵循下面的结构,就像当前预定义宏头文件一样。首先是版权和许可证声明,然后是包含保护符:

/*
Copyright Jane Doe YYYY
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
https://boost.ac.cn/LICENSE_1_0.txt)
*/

#ifndef BOOST_PREDEF_category_tag_H
#define BOOST_PREDEF_category_tag_H

如果检测依赖于另一个预定义宏的检测,您应该在此处包含那些头文件。

#include <boost/predef/CATEGORY_TAG/DEPENDENCY.h>

根据您定义预定义宏的方式,您至少需要包含 `version_number.h` 头文件。但您可能还想包含 `make.h` 头文件,其中包含用于分解版本号的实用宏:

#include <boost/predef/version_number.h>
#include <boost/predef/make.h>

Predef 库使用 Asciidoctor 进行文档编写,并且为了使各个预定义宏出现在参考部分,我们在代码中添加了文档,然后是预定义宏的零值默认定义。我们强烈推荐这种特定的文档和默认定义放置方式,因为一些开发环境会自动解释这一点,并为宏提供内联帮助。这尤其适用于流行的 Eclipse IDE:

/* tag::reference[]

= `BOOST_category_tag`

Documentation about what is detected.

*/

#define BOOST_category_tag BOOST_VERSION_NUMBER_NOT_AVAILABLE

接下来是特定预定义宏的检测和定义。其结构是进行一次总体检查(`condition_a`),并将进一步的版本检测放在其中。总体检查内的第一个操作是“#undef BOOST_category_tag”,它会移除零值默认定义。其余部分由您决定如何进行检查以定义版本。但至少必须“#define BOOST_category_tag BOOST_VERSION_NUMBER_AVAILABLE”作为最小的指示预定义宏已被检测到的后备。

#if (condition_a)
#   undef BOOST_category_tag
#   if (condition_b)
#        define BOOST_category_tag BOOST_VERSION_NUMBER(major,minor,patch)
#    else
#        define BOOST_category_tag BOOST_VERSION_NUMBER_AVAILABLE
#    endif
#endif

我们还需要提供预定义宏的 `*_AVAILABLE` 版本。

#if BOOST_category_tag
#   define BOOST_category_tag_AVAILABLE
#endif

为了方便起见,我们还想提供一个 `*_NAME` 宏:

#define BOOST_category_tag_NAME "Name"

至此,我们结束了包含保护符。我们在测试声明之前这样做,因为测试系统会多次包含头文件以生成所需的测试代码。

#endif

预定义宏的测试是自动化的,以生成对所有已定义宏(无论是否检测到)的检查。为此,我们需要向测试系统声明预定义宏。对于常规使用,此声明为空。在测试程序中,它们会特殊展开以创建信息性输出:

#include <boost/predef/detail/test.h>
BOOST_PREDEF_DECLARE_TEST(BOOST_category_tag,BOOST_category_tag_NAME)

3.3. 添加互斥的预定义宏

对于需要互斥检测的预定义宏头文件,我们需要添加检查和定义,以检测何时该预定义宏被多个头文件检测到。

内部编译器、操作系统和平台在首次检测到预定义宏时定义 `BOOST_PREDEF_DETAIL_COMP_DETECTED`、`BOOST_PREDEF_DEFAIL_OS_DETECTED` 和 `BOOST_PREDEF_DETAIL_PLAT_DETECTED`。这用于防止在后续包含的头文件中重复定义检测。在这种情况下,检测应写为:

#if !BOOST_PREDEF_DETAIL_category_DETECTED && (condition_a)
#   undef BOOST_category_tag
#   if (condition_b)
#        define BOOST_category_tag BOOST_VERSION_NUMBER(major,minor,patch)
#    else
#        define BOOST_category_tag BOOST_VERSION_NUMBER(0,0,1)
#    endif
#endif

并且我们还包含一个在检测到 `*_DETECTED` 宏时定义的头文件:

#if BOOST_category_tag
#   define BOOST_category_tag_AVAILABLE
#   include <boost/predef/detail/CATEGORY_detected.h>
#endif

头文件的其他所有内容与基本检测头文件相同。

3.4. 添加互斥但模拟的预定义宏

由于编译器经常被其他编译器模拟,我们既希望拥有互斥的编译器检测,也希望提供我们检测到编译器模拟的信息。为了实现这一点,我们定义了一个本地的 `*_DETECTION` 宏用于编译器检测。然后,有条件地定义基本编译器预定义宏 `BOOST_COMP_compiler` 或备用预定义宏 `BOOST_COMP_compiler_EMULATED`。

初始检测将如下所示:

#if (condition_a)
#   if (condition_b)
#        define BOOST_COMP_tag_DETECTION BOOST_VERSION_NUMBER(major,minor,patch)
#    else
#        define BOOST_COMP_tag_DETECTION BOOST_VERSION_NUMBER_AVAILABLE
#    endif
#endif

然后我们可以有条件地定义基本或模拟的预定义宏:

#ifdef BOOST_COMP_tag_DETECTION
#   if defined(BOOST_PREDEF_DETAIL_COMP_DETECTED)
#       define BOOST_COMP_tag_EMULATED BOOST_COMP_tag_DETECTION
#   else
#       undef BOOST_COMP_tag
#       define BOOST_COMP_tag BOOST_COMP_tag_DETECTION
#   endif
#   define BOOST_category_tag_AVAILABLE
#   include <boost/predef/detail/comp_detected.h>
#endif

3.5. 使用工具模式宏

通过包含:

#include <boost/predef/make.h>

您将获得一组实用宏,用于分解编译器定义的常见版本宏。例如,EDG 编译器使用简单的三位数版本宏(M,N,P)。它可以分解并定义为:

#define BOOST_COMP_EDG BOOST_PREDEF_MAKE_N_N_N(__EDG_VERSION__)

分解宏分为三种类型:十进制分解、十六进制分解和日期分解。它们遵循使用“N”表示十进制,“F”表示十六进制,“Y”、“M”、“D”表示日期的格式。

4. 参考

4.1. `BOOST_ARCH` 架构宏

4.1.1. `BOOST_ARCH_ALPHA`

DEC Alpha 架构。

符号 版本

__alpha__

检测

__alpha

检测

_M_ALPHA

检测

__alpha_ev4__

4.0.0

__alpha_ev5__

5.0.0

__alpha_ev6__

6.0.0

4.1.2. `BOOST_ARCH_ARM`

ARM 架构。

符号 版本

__ARM_ARCH

检测

__TARGET_ARCH_ARM

检测

__TARGET_ARCH_THUMB

检测

_M_ARM

检测

__arm__

检测

__arm64

检测

__thumb__

检测

_M_ARM64

检测

__aarch64__

检测

__AARCH64EL__

检测

__ARM_ARCH_7__

检测

__ARM_ARCH_7A__

检测

__ARM_ARCH_7R__

检测

__ARM_ARCH_7M__

检测

__ARM_ARCH_6K__

检测

__ARM_ARCH_6Z__

检测

__ARM_ARCH_6KZ__

检测

__ARM_ARCH_6T2__

检测

__ARM_ARCH_5TE__

检测

__ARM_ARCH_5TEJ__

检测

__ARM_ARCH_4T__

检测

__ARM_ARCH_4__

检测

__ARM_ARCH

V.0.0

__TARGET_ARCH_ARM

V.0.0

__TARGET_ARCH_THUMB

V.0.0

_M_ARM

V.0.0

__arm64

8.0.0

_M_ARM64

8.0.0

__aarch64__

8.0.0

__AARCH64EL__

8.0.0

__ARM_ARCH_7__

7.0.0

__ARM_ARCH_7A__

7.0.0

__ARM_ARCH_7R__

7.0.0

__ARM_ARCH_7M__

7.0.0

__ARM_ARCH_6K__

6.0.0

__ARM_ARCH_6Z__

6.0.0

__ARM_ARCH_6KZ__

6.0.0

__ARM_ARCH_6T2__

6.0.0

__ARM_ARCH_5TE__

5.0.0

__ARM_ARCH_5TEJ__

5.0.0

__ARM_ARCH_4T__

4.0.0

__ARM_ARCH_4__

4.0.0

4.1.3. `BOOST_ARCH_BLACKFIN`

Analog Devices 的 Blackfin 处理器。

符号 版本

__bfin__

检测

__BFIN__

检测

bfin

检测

BFIN

检测

4.1.4. `BOOST_ARCH_CONVEX`

Convex Computer 架构。

符号 版本

__convex__

检测

__convex_c1__

1.0.0

__convex_c2__

2.0.0

__convex_c32__

3.2.0

__convex_c34__

3.4.0

__convex_c38__

3.8.0

4.1.5. `BOOST_ARCH_E2K`

E2K 架构。

符号 版本

__e2k__

检测

__e2k__

V.0.0

4.1.6. `BOOST_ARCH_IA64`

Intel Itanium 64 架构。

符号 版本

__ia64__

检测

_IA64

检测

__IA64__

检测

__ia64

检测

_M_IA64

检测

__itanium__

检测

4.1.7. `BOOST_ARCH_M68K`

Motorola 68k 架构。

符号 版本

__m68k__

检测

M68000

检测

__mc68060__

6.0.0

mc68060

6.0.0

__mc68060

6.0.0

__mc68040__

4.0.0

mc68040

4.0.0

__mc68040

4.0.0

__mc68030__

3.0.0

mc68030

3.0.0

__mc68030

3.0.0

__mc68020__

2.0.0

mc68020

2.0.0

__mc68020

2.0.0

__mc68010__

1.0.0

mc68010

1.0.0

__mc68010

1.0.0

__mc68000__

0.0.1

mc68000

0.0.1

__mc68000

0.0.1

4.1.8. `BOOST_ARCH_MIPS`

MIPS 架构。

符号 版本

__mips__

检测

__mips

检测

__MIPS__

检测

__mips

V.0.0

_MIPS_ISA_MIPS1

1.0.0

_R3000

1.0.0

_MIPS_ISA_MIPS2

2.0.0

__MIPS_ISA2__

2.0.0

_R4000

2.0.0

_MIPS_ISA_MIPS3

3.0.0

__MIPS_ISA3__

3.0.0

_MIPS_ISA_MIPS4

4.0.0

__MIPS_ISA4__

4.0.0

4.1.9. `BOOST_ARCH_PARISC`

HP/PA RISC 架构。

符号 版本

__hppa__

检测

__hppa

检测

__HPPA__

检测

_PA_RISC1_0

1.0.0

_PA_RISC1_1

1.1.0

__HPPA11__

1.1.0

__PA7100__

1.1.0

_PA_RISC2_0

2.0.0

__RISC2_0__

2.0.0

__HPPA20__

2.0.0

__PA8000__

2.0.0

4.1.10. `BOOST_ARCH_PPC`

PowerPC 架构。

符号 版本

__powerpc

检测

__powerpc__

检测

__powerpc64__

检测

__POWERPC__

检测

__ppc__

检测

__ppc64__

检测

__PPC__

检测

__PPC64__

检测

_M_PPC

检测

_ARCH_PPC

检测

_ARCH_PPC64

检测

__PPCGECKO__

检测

__PPCBROADWAY__

检测

_XENON

检测

__ppc

检测

__ppc601__

6.1.0

_ARCH_601

6.1.0

__ppc603__

6.3.0

_ARCH_603

6.3.0

__ppc604__

6.4.0

__ppc604__

6.4.0

4.1.11. `BOOST_ARCH_PPC_64`

PowerPC 64 位架构。

符号 版本

__powerpc64__

检测

__ppc64__

检测

__PPC64__

检测

_ARCH_PPC64

检测

4.1.12. `BOOST_ARCH_PTX`

PTX 架构。

符号 版本

__CUDA_ARCH__

检测

__CUDA_ARCH__

V.R.0

4.1.13. `BOOST_ARCH_PYRAMID`

Pyramid 9810 架构。

符号 版本

pyr

检测

4.1.14. `BOOST_ARCH_RISCV`

RISC-V 架构。

符号 版本

__riscv

检测

4.1.15. `BOOST_ARCH_RS6000`

RS/6000 架构。

符号 版本

__THW_RS6000

检测

_IBMR2

检测

_POWER

检测

_ARCH_PWR

检测

_ARCH_PWR2

检测

4.1.16. `BOOST_ARCH_SPARC`

SPARC 架构。

符号 版本

__sparc__

检测

__sparc

检测

__sparcv9

9.0.0

__sparc_v9__

9.0.0

__sparcv8

8.0.0

__sparc_v8__

8.0.0

4.1.17. `BOOST_ARCH_SH`

SuperH 架构:如果可用,则具体检测版本 [1-5]。

符号 版本

__sh__

检测

__SH5__

5.0.0

__SH4__

4.0.0

__sh3__

3.0.0

__SH3__

3.0.0

__sh2__

2.0.0

__sh1__

1.0.0

4.1.18. `BOOST_ARCH_SYS370`

System/370 架构。

符号 版本

__370__

检测

__THW_370__

检测

4.1.19. `BOOST_ARCH_SYS390`

System/390 架构。

符号 版本

__s390__

检测

__s390x__

检测

4.1.20. `BOOST_ARCH_X86`

Intel x86 架构。这是一个类别,用于指示检测到 `BOOST_ARCH_X86_32` 或 `BOOST_ARCH_X86_64`。

4.1.21. `BOOST_ARCH_Z`

z/Architecture 架构。

符号 版本

__SYSC_ZARCH__

检测

4.1.22. `BOOST_ARCH_X86_32`

Intel x86 架构:如果可用,则具体检测版本 [3-6]。

符号 版本

i386

检测

__i386__

检测

__i486__

检测

__i586__

检测

__i686__

检测

__i386

检测

_M_IX86

检测

_X86_

检测

__THW_INTEL__

检测

__I86__

检测

__INTEL__

检测

__I86__

V.0.0

_M_IX86

V.0.0

__i686__

6.0.0

__i586__

5.0.0

__i486__

4.0.0

__i386__

3.0.0

4.1.23. `BOOST_ARCH_X86_64`

X86-64 架构。

符号 版本

__x86_64

检测

__x86_64__

检测

__amd64__

检测

__amd64

检测

_M_X64

检测

4.2. `BOOST_COMP` 编译器宏

4.2.1. `BOOST_COMP_BORLAND`

Borland C++ 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__BORLANDC__

检测

__CODEGEARC__

检测

__BORLANDC__

V.R.P

__CODEGEARC__

V.R.P

4.2.2. `BOOST_COMP_CLANG`

Clang 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__clang__

检测

__clang_major__, __clang_minor__, __clang_patchlevel__

V.R.P

4.2.3. `BOOST_COMP_COMO`

Comeau C++ 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__COMO__

检测

__COMO_VERSION__

V.R.P

4.2.4. `BOOST_COMP_DEC`

Compaq C/C++ 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__DECCXX

检测

__DECC

检测

__DECCXX_VER

V.R.P

__DECC_VER

V.R.P

4.2.5. `BOOST_COMP_DIAB`

Diab C/C++ 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__DCC__

检测

__VERSION_NUMBER__

V.R.P

4.2.6. `BOOST_COMP_DMC`

Digital Mars 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__DMC__

检测

__DMC__

V.R.P

4.2.7. `BOOST_COMP_SYSC`

Dignus Systems/C++ 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__SYSC__

检测

__SYSC_VER__

V.R.P

4.2.8. `BOOST_COMP_EDG`

EDG C++ Frontend 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__EDG__

检测

__EDG_VERSION__

V.R.0

4.2.9. `BOOST_COMP_PATH`

EKOpath 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__PATHCC__

检测

__PATHCC__, __PATHCC_MINOR__, __PATHCC_PATCHLEVEL__

V.R.P

4.2.10. `BOOST_COMP_GNUC`

Gnu GCC C/C++ 编译器。版本号可作为主版本、次版本和补丁版本(如果可用)获得。

符号 版本

__GNUC__

检测

__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__

V.R.P

__GNUC__, __GNUC_MINOR__

V.R.0

4.2.11. `BOOST_COMP_GCCXML`

GCC XML 编译器。

符号 版本

__GCCXML__

检测

4.2.12. `BOOST_COMP_GHS`

Green Hills C/C++ 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__ghs

检测

__ghs__

检测

__GHS_VERSION_NUMBER__

V.R.P

__ghs

V.R.P

4.2.13. `BOOST_COMP_HPACC`

HP aC++ 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__HP_aCC

检测

__HP_aCC

V.R.P

4.2.14. `BOOST_COMP_IAR`

IAR C/C++ 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__IAR_SYSTEMS_ICC__

检测

__VER__

V.R.P

4.2.15. `BOOST_COMP_IBM`

IBM XL C/C++ 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__IBMCPP__

检测

__xlC__

检测

__xlc__

检测

__COMPILER_VER__

V.R.P

__xlC__

V.R.P

__xlc__

V.R.P

__IBMCPP__

V.R.P

4.2.16. `BOOST_COMP_INTEL`

Intel C/C++ 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__INTEL_COMPILER

检测

__ICL

检测

__ICC

检测

__ECC

检测

__INTEL_COMPILER

V.R

__INTEL_COMPILER__INTEL_COMPILER_UPDATE

V.R.P

由于 Intel 在发布版本号上的一个错误,当 `__INTEL_COMPILER` 为 `9999` 时,它会被检测为版本 12.1.0。

4.2.17. `BOOST_COMP_KCC`

Kai C++ 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__KCC

检测

__KCC_VERSION

V.R.P

4.2.18. `BOOST_COMP_LLVM`

LLVM 编译器。

符号 版本

__llvm__

检测

4.2.19. `BOOST_COMP_HIGHC`

MetaWare High C/C++ 编译器。

符号 版本

__HIGHC__

检测

4.2.20. `BOOST_COMP_MWERKS`

Metrowerks CodeWarrior 编译器。版本号可作为主版本、次版本和补丁版本获得。

符号 版本

__MWERKS__

检测

__CWCC__

检测

__CWCC__

V.R.P

__MWERKS__

V.R.P >= 4.2.0

__MWERKS__

9.R.0

__MWERKS__

8.R.0

4.2.21. `BOOST_COMP_MRI`

Microtec C/C++ 编译器。

符号 版本

_MRI

检测

4.2.22. `BOOST_COMP_MPW`

MPW C++ 编译器。版本号可作为主版本和次版本获得。

符号 版本

__MRC__

检测

MPW_C

检测

MPW_CPLUS

检测

__MRC__

V.R.0

4.2.23. `BOOST_COMP_NVCC`

NVCC 编译器。版本号以 7.5 版本开始,分为主版本号、次版本号和补丁版本号。

符号 版本

__NVCC__

检测

__CUDACC_VER_MAJOR__, __CUDACC_VER_MINOR__, __CUDACC_VER_BUILD__

V.R.P

4.2.24. BOOST_COMP_PALM

Palm C/C++ 编译器。版本号分为主版本号、次版本号和补丁版本号。

符号 版本

_PACC_VER

检测

_PACC_VER

V.R.P

4.2.25. BOOST_COMP_PGI

Portland Group C/C++ 编译器。

符号 版本

__PGI

检测

__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__

V.R.P

4.2.26. BOOST_COMP_SGI

SGI MIPSpro 编译器。版本号分为主版本号、次版本号和补丁版本号。

符号 版本

__sgi

检测

sgi

检测

_SGI_COMPILER_VERSION

V.R.P

_COMPILER_VERSION

V.R.P

4.2.27. BOOST_COMP_SUNPRO

Oracle Solaris Studio 编译器。版本号分为主版本号、次版本号和补丁版本号。

符号 版本

__SUNPRO_CC

检测

__SUNPRO_C

检测

__SUNPRO_CC

V.R.P

__SUNPRO_C

V.R.P

__SUNPRO_CC

VV.RR.P

__SUNPRO_C

VV.RR.P

4.2.28. BOOST_COMP_TENDRA

TenDRA C/C++ 编译器。

符号 版本

__TenDRA__

检测

4.2.29. BOOST_COMP_MSVC

Microsoft Visual C/C++ 编译器。版本号分为主版本号、次版本号和补丁版本号。

符号 版本

_MSC_VER

检测

_MSC_FULL_VER

V.R.P

_MSC_VER

V.R.0

2015 年之后的 Visual Studio 版本将不再由 Boost Predef 作为市场版本号标识。取而代之的是直接使用编译器版本号,即 _MSC_VER 号。

4.2.30. BOOST_COMP_WATCOM

Watcom C++ 编译器。版本号分为主版本号和次版本号。

符号 版本

__WATCOMC__

检测

__WATCOMC__

V.R.P

4.3. BOOST_LANG 语言标准宏

4.3.1. BOOST_LANG_CUDA

CUDA C/C++ 语言。如果可用,版本号将检测为 VV.RR.P。

符号 版本

__CUDACC__

检测

__CUDA__

检测

CUDA_VERSION

VV.RR.P

4.3.2. BOOST_LANG_OBJC

Objective-C 语言。

符号 版本

__OBJC__

检测

4.3.3. BOOST_LANG_STDC

Standard C 语言。如果可用,则从 Epoch 日期开始,年份将检测为 YYYY.MM.1。

符号 版本

__STDC__

检测

__STDC_VERSION__

V.R.P

4.3.4. BOOST_LANG_STDCPP

Standard C++ 语言。如果可用,则从 Epoch 日期开始,年份将检测为 YYYY.MM.1。由于 C++ 标准化过程的工作方式,定义的版本年份将不是常用的标准年份。具体来说,定义的版本是

表 1. 检测到的版本号与 C++ 标准年份
检测到的版本号 标准年份 C++ 标准

27.11.1

1998

ISO/IEC 14882:1998

41.3.1

2011

ISO/IEC 14882:2011

44.2.1

2014

ISO/IEC 14882:2014

47.3.1

2017

ISO/IEC 14882:2017

符号 版本

__cplusplus

检测

__cplusplus

YYYY.MM.1

4.3.5. BOOST_LANG_STDCPPCLI

Standard C++/CLI 语言。如果可用,则从 Epoch 日期开始,年份将检测为 YYYY.MM.1。

符号 版本

__cplusplus_cli

检测

__cplusplus_cli

YYYY.MM.1

4.3.6. BOOST_LANG_STDECPP

符号 版本

__embedded_cplusplus

检测

4.4. BOOST_LIB 库宏

4.4.1. BOOST_LIB_C_CLOUDABI

cloudlibc - CloudABI 的标准 C 库。版本号分为主版本号和次版本号。

符号 版本

__cloudlibc__

检测

__cloudlibc_major__, __cloudlibc_minor__

V.R.0

4.4.2. BOOST_LIB_C_GNU

GNU glibc 标准 C 库。版本号分为主版本号和次版本号。

符号 版本

__GLIBC__

检测

__GNU_LIBRARY__

检测

__GLIBC__, __GLIBC_MINOR__

V.R.0

__GNU_LIBRARY__, __GNU_LIBRARY_MINOR__

V.R.0

4.4.3. BOOST_LIB_C_UC

uClibc 标准 C 库。

符号 版本

__UCLIBC__

检测

__UCLIBC_MAJOR__, __UCLIBC_MINOR__, __UCLIBC_SUBLEVEL__

V.R.P

4.4.4. BOOST_LIB_C_VMS

VMS libc 标准 C 库。版本号分为主版本号、次版本号和补丁版本号。

符号 版本

__CRTL_VER

检测

__CRTL_VER

V.R.P

4.4.5. BOOST_LIB_C_ZOS

z/OS libc 标准 C 库。版本号分为主版本号、次版本号和补丁版本号。

符号 版本

__LIBREL__

检测

__LIBREL__

V.R.P

__TARGET_LIB__

V.R.P

4.4.6. BOOST_LIB_STD_CXX

libc++ C++ 标准库。

符号 版本

_LIBCPP_VERSION

检测

_LIBCPP_VERSION

V.0.P

4.4.7. BOOST_LIB_STD_DINKUMWARE

Dinkumware 标准 C++ 库。如果可用,版本号为 major, minor, 和 patch。

符号 版本

_YVALS, __IBMCPP__

检测

_CPPLIB_VER

检测

_CPPLIB_VER

V.R.0

4.4.8. BOOST_LIB_STD_COMO

Comeau Computing 标准 C++ 库。版本号为 major。

符号 版本

__LIBCOMO__

检测

__LIBCOMO_VERSION__

V.0.0

4.4.9. BOOST_LIB_STD_MSIPL

Modena Software Lib++ 标准 C++ 库。

符号 版本

MSIPL_COMPILE_H

检测

__MSIPL_COMPILE_H

检测

4.4.10. BOOST_LIB_STD_MSL

Metrowerks 标准 C++ 库。版本号分为 major, minor, 和 patch。

符号 版本

__MSL_CPP__

检测

__MSL__

检测

__MSL_CPP__

V.R.P

__MSL__

V.R.P

4.4.11. BOOST_LIB_STD_RW

Roguewave 标准 C++ 库。如果可用,版本号为 major, minor, 和 patch。

符号 版本

__STD_RWCOMPILER_H__

检测

_RWSTD_VER

检测

_RWSTD_VER

V.R.P

4.4.12. BOOST_LIB_STD_SGI

SGI 标准 C++ 库。如果可用,版本号为 major, minor, 和 patch。

符号 版本

__STL_CONFIG_H

检测

__SGI_STL

V.R.P

4.4.13. BOOST_LIB_STD_GNU

GNU libstdc++ 标准 C++ 库。版本号以年份(从 1970 年起)、月份和日期表示。

符号 版本

__GLIBCXX__

检测

__GLIBCPP__

检测

__GLIBCXX__

V.R.P

__GLIBCPP__

V.R.P

4.4.14. BOOST_LIB_STD_STLPORT

STLport Standard C++ 库。版本号分为 major, minor, 和 patch。

符号 版本

__SGI_STL_PORT

检测

_STLPORT_VERSION

检测

_STLPORT_MAJOR, _STLPORT_MINOR, _STLPORT_PATCHLEVEL

V.R.P

_STLPORT_VERSION

V.R.P

__SGI_STL_PORT

V.R.P

4.4.15. BOOST_LIB_STD_IBM

符号 版本

__IBMCPP__

检测

4.4.16. BOOST_LIB_STD_MSVC

Microsoft 的 C++ 标准库。如果可用,版本号为 major, minor, 和 patch。补丁号是从 _MSVC_STL_UPDATE 中提取其最后五位数字(见下文)。这意味着将 _MSVC_STL_UPDATE 值粘贴到 BOOST_VERSION_NUMBER 中将生成一个与 BOOST_LIB_STD_MSVC 直接可比的版本号。

符号 版本

_MSVC_STL_VERSION

检测

_MSVC_STL_VERSION

VV.R.0

_MSVC_STL_UPDATE

00.0.0YYYMM

4.5. BOOST_OS 操作系统宏

4.5.1. BOOST_OS_AIX

IBM AIX 操作系统。版本号分为 major, minor, 和 patch。

符号 版本

_AIX

检测

__TOS_AIX__

检测

_AIX43

4.3.0

_AIX41

4.1.0

_AIX32

3.2.0

_AIX3

3.0.0

4.5.2. BOOST_OS_AMIGAOS

AmigaOS 操作系统。

符号 版本

AMIGA

检测

__amigaos__

检测

4.5.3. BOOST_OS_BEOS

BeOS 操作系统。

符号 版本

__BEOS__

检测

4.5.4. BOOST_OS_BSD

BSD 操作系统。

BSD 有各种分支操作系统,每种都单独检测。本项检测以下变体并设置相应的版本号宏以匹配

在所有情况下,通用的 BOOST_OS_BSD 都会被设置以指示某种形式的 BSD。如果检测到上述变体,则相应的宏也会被设置。
符号 版本

BSD

检测

_SYSTYPE_BSD

检测

BSD4_2

4.2.0

BSD4_3

4.3.0

BSD4_4

4.4.0

BSD

V.R.0

4.5.5. BOOST_OS_CYGWIN

Cygwin 环境。

符号 版本

__CYGWIN__

检测

CYGWIN_VERSION_API_MAJOR, CYGWIN_VERSION_API_MINOR

V.R.0

4.5.6. BOOST_OS_HAIKU

Haiku 操作系统。

符号 版本

__HAIKU__

检测

4.5.7. BOOST_OS_HPUX

HP-UX 操作系统。

符号 版本

hpux

检测

_hpux

检测

__hpux

检测

4.5.8. BOOST_OS_IOS

iOS 操作系统。

符号 版本

__APPLE__

检测

__MACH__

检测

__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__

检测

__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__

__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__*1000

4.5.9. BOOST_OS_IRIX

IRIX 操作系统。

符号 版本

sgi

检测

__sgi

检测

4.5.10. BOOST_OS_LINUX

Linux 操作系统。

符号 版本

linux

检测

__linux

检测

__linux__

检测

__gnu_linux__

检测

4.5.11. BOOST_OS_MACOS

Mac OS 操作系统。

符号 版本

macintosh

检测

Macintosh

检测

__APPLE__

检测

__MACH__

检测

__APPLE__, __MACH__

10.0.0

否则

9.0.0

4.5.12. BOOST_OS_OS400

IBM OS/400 操作系统。

符号 版本

__OS400__

检测

4.5.13. BOOST_OS_QNX

QNX 操作系统。版本号如果可能,分为 major 和 minor。版本 4 会被单独检测。

符号 版本

__QNX__

检测

__QNXNTO__

检测

_NTO_VERSION

V.R.0

__QNX__

4.0.0

4.5.14. BOOST_OS_SOLARIS

Solaris 操作系统。

符号 版本

sun

检测

__sun

检测

4.5.15. BOOST_OS_UNIX

Unix Environment 操作系统。

符号 版本

unix

检测

__unix

检测

_XOPEN_SOURCE

检测

_POSIX_SOURCE

检测

4.5.16. BOOST_OS_SVR4

SVR4 Environment 操作系统。

符号 版本

__sysv__

检测

__SVR4

检测

__svr4__

检测

_SYSTYPE_SVR4

检测

4.5.17. BOOST_OS_VMS

VMS 操作系统。

符号 版本

VMS

检测

__VMS

检测

__VMS_VER

V.R.P

4.5.18. BOOST_OS_WINDOWS

Microsoft Windows 操作系统。

符号 版本

_WIN32

检测

_WIN64

检测

__WIN32__

检测

__TOS_WIN__

检测

__WINDOWS__

检测

4.5.19. BOOST_OS_BSD_BSDI

BSDi BSD/OS 操作系统。

符号 版本

__bsdi__

检测

4.5.20. BOOST_OS_BSD_DRAGONFLY

DragonFly BSD 操作系统。

符号 版本

__DragonFly__

检测

4.5.21. BOOST_OS_BSD_FREE

FreeBSD 操作系统。

符号 版本

__FreeBSD__

检测

__FreeBSD_version

V.R.P

4.5.22. BOOST_OS_BSD_NET

NetBSD 操作系统。

符号 版本

__NETBSD__

检测

__NetBSD__

检测

__NETBSD_version

V.R.P

NetBSD0_8

0.8.0

NetBSD0_9

0.9.0

NetBSD1_0

1.0.0

__NetBSD_Version

V.R.P

4.5.23. BOOST_OS_BSD_OPEN

OpenBSD 操作系统。

符号 版本

__OpenBSD__

检测

OpenBSD2_0

2.0.0

OpenBSD2_1

2.1.0

OpenBSD2_2

2.2.0

OpenBSD2_3

2.3.0

OpenBSD2_4

2.4.0

OpenBSD2_5

2.5.0

OpenBSD2_6

2.6.0

OpenBSD2_7

2.7.0

OpenBSD2_8

2.8.0

OpenBSD2_9

2.9.0

OpenBSD3_0

3.0.0

OpenBSD3_1

3.1.0

OpenBSD3_2

3.2.0

OpenBSD3_3

3.3.0

OpenBSD3_4

3.4.0

OpenBSD3_5

3.5.0

OpenBSD3_6

3.6.0

OpenBSD3_7

3.7.0

OpenBSD3_8

3.8.0

OpenBSD3_9

3.9.0

OpenBSD4_0

4.0.0

OpenBSD4_1

4.1.0

OpenBSD4_2

4.2.0

OpenBSD4_3

4.3.0

OpenBSD4_4

4.4.0

OpenBSD4_5

4.5.0

OpenBSD4_6

4.6.0

OpenBSD4_7

4.7.0

OpenBSD4_8

4.8.0

OpenBSD4_9

4.9.0

OpenBSD5_0

5.0.0

OpenBSD5_1

5.1.0

OpenBSD5_2

5.2.0

OpenBSD5_3

5.3.0

OpenBSD5_4

5.4.0

OpenBSD5_5

5.5.0

OpenBSD5_6

5.6.0

OpenBSD5_7

5.7.0

OpenBSD5_8

5.8.0

OpenBSD5_9

5.9.0

OpenBSD6_0

6.0.0

OpenBSD6_1

6.1.0

OpenBSD6_2

6.2.0

OpenBSD6_3

6.3.0

OpenBSD6_4

6.4.0

OpenBSD6_5

6.5.0

OpenBSD6_6

6.6.0

OpenBSD6_7

6.7.0

OpenBSD6_8

6.8.0

OpenBSD6_9

6.9.0

4.6. BOOST_PLAT 平台宏

4.6.1. BOOST_PLAT_ANDROID

Android 平台。

符号 版本

__ANDROID__

检测

4.6.2. BOOST_PLAT_CLOUDABI

CloudABI 平台。

符号 版本

__CloudABI__

检测

4.6.3. BOOST_PLAT_IOS_DEVICE

4.6.4. BOOST_PLAT_IOS_SIMULATOR

符号 版本

TARGET_IPHONE_SIMULATOR

检测

TARGET_OS_SIMULATOR

检测

4.6.5. BOOST_PLAT_MINGW

MinGW 平台,任何一种。版本号分为 major, minor, 和 patch。

符号 版本

__MINGW32__

检测

__MINGW64__

检测

__MINGW64_VERSION_MAJOR, __MINGW64_VERSION_MINOR

V.R.0

__MINGW32_VERSION_MAJOR, __MINGW32_VERSION_MINOR

V.R.0

4.6.6. BOOST_PLAT_MINGW32

MinGW 平台。版本号分为 major, minor, 和 patch。

符号 版本

__MINGW32__

检测

__MINGW32_VERSION_MAJOR, __MINGW32_VERSION_MINOR

V.R.0

4.6.7. BOOST_PLAT_MINGW64

MinGW-w64 平台。版本号分为 major, minor, 和 patch。

符号 版本

__MINGW64__

检测

__MINGW64_VERSION_MAJOR, __MINGW64_VERSION_MINOR

V.R.0

4.6.8. BOOST_PLAT_WINDOWS_DESKTOP

UWP 用于 Windows Desktop 开发。当 Platform SDK 太旧以至于不支持 UWP 时也可用。

符号 版本

WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP

检测

!BOOST_PLAT_WINDOWS_UWP

检测

4.6.9. BOOST_PLAT_WINDOWS_PHONE

UWP 用于 Windows Phone 开发。

符号 版本

WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP

检测

4.6.10. BOOST_PLAT_WINDOWS_RUNTIME

已弃用。

UWP 用于 Windows Phone 或 Store 开发。这不符合 UWP 的现有开发模型,并且已弃用。请使用其他 `BOOST_PLAT_WINDOWS_*` 定义。

符号 版本

BOOST_PLAT_WINDOWS_PHONE

检测

BOOST_PLAT_WINDOWS_STORE

检测

4.6.11. BOOST_PLAT_WINDOWS_SERVER

UWP 用于 Windows Server 开发。

符号 版本

WINAPI_FAMILY == WINAPI_FAMILY_SERVER

检测

4.6.12. BOOST_PLAT_WINDOWS_STORE

UWP 用于 Windows Store 开发。

符号 版本

WINAPI_FAMILY == WINAPI_FAMILY_PC_APP

检测

WINAPI_FAMILY == WINAPI_FAMILY_APP (已弃用)

检测

4.6.13. BOOST_PLAT_WINDOWS_SYSTEM

UWP 用于 Windows System 开发。

符号 版本

WINAPI_FAMILY == WINAPI_FAMILY_SYSTEM

检测

4.6.14. BOOST_PLAT_WINDOWS_UWP

Universal Windows Platform 在当前开发环境能够针对 UWP 开发时可用。

符号 版本

__MINGW64_VERSION_MAJOR 来自 _mingw.h

>= 3

VER_PRODUCTBUILD 来自 ntverp.h

>= 9200

4.7. BOOST_HW 硬件宏

4.7.1. 使用 BOOST_HW_SIMD_* 预定义宏

SIMD 预定义宏取决于编译器选项。例如,您需要向 clang 或 gcc 添加 -msse3 选项以启用 SSE3。SIMD 预定义宏也是包含性的。这意味着如果启用了 SSE3,则所有其他版本较低的扩展都将隐式启用并被检测到。然而,一些扩展是 CPU 特定的,它们可能不会在启用更高版本时被检测到或启用。

SSE(1) 和 SSE2 在使用 x86-64 架构时默认自动启用。

要检查是否启用了任何 SIMD 扩展,您可以使用

#include <boost/predef/hardware/simd.h>
#include <iostream>

int main()
{
#if defined(BOOST_HW_SIMD_AVAILABLE)
    std::cout << "SIMD detected!" << std::endl;
#endif
    return 0;
}

在编写 SIMD 特定代码时,您可能需要检查是否检测到了某个特定扩展。为此,您必须使用正确的体系结构预定义宏并进行比较。这些预定义宏的格式为 BOOST_HW_SIMD_"ARCH" (其中 "ARCH"ARM, PPC, 或 X86)。例如,如果您为 x86 体系结构编译代码,则必须使用 BOOST_HW_SIMD_X86。其值将是为该体系结构检测到的最新 SIMD 扩展的版本号。

要检查扩展是否已启用

#include <boost/predef/hardware/simd.h>
#include <iostream>

int main()
{
#if BOOST_HW_SIMD_X86 >= BOOST_HW_SIMD_X86_SSE3_VERSION
    std::cout << "This is SSE3!" << std::endl;
#endif
    return 0;
}
_VERSION 定义将版本号映射到实际的真实标识符。这样可以更轻松地进行比较,而无需处理版本号。

“严格”检查检测到的最新扩展

#include <boost/predef/hardware/simd.h>
#include <iostream>

int main()
{
#if BOOST_HW_SIMD_X86 == BOOST_HW_SIMD_X86_SSE3_VERSION
    std::cout << "This is SSE3 and this is the most recent enabled extension!"
        << std::endl;
#endif
    return 0;
}

由于预定义宏的版本系统和 SIMD 扩展宏的包含性,您可以轻松检查支持的扩展范围

#include <boost/predef/hardware/simd.h>
#include <iostream>

int main()
{
#if BOOST_HW_SIMD_X86 >= BOOST_HW_SIMD_X86_SSE2_VERSION &&\
    BOOST_HW_SIMD_X86 <= BOOST_HW_SIMD_X86_SSSE3_VERSION
    std::cout << "This is SSE2, SSE3 and SSSE3!" << std::endl;
#endif
    return 0;
}
与 gcc 和 clang 不同,Visual Studio 不允许您精确指定要使用的 SSE 变体,只能进行 SSE、SSE2、AVX 和 AVX2 的检测。有关更多信息,请参阅 [@https://msdn.microsoft.com/en-us/library/b0084kay.aspx 此处]。

4.7.2. BOOST_HW_SIMD_ARM

ARM 的 SIMD 扩展(如果检测到)。版本号取决于检测到的最新扩展。

符号 版本

__ARM_NEON__

检测

__aarch64__

检测

_M_ARM

检测

_M_ARM64

检测

符号 版本

__ARM_NEON__

BOOST_HW_SIMD_ARM_NEON_VERSION

__aarch64__

BOOST_HW_SIMD_ARM_NEON_VERSION

_M_ARM

BOOST_HW_SIMD_ARM_NEON_VERSION

_M_ARM64

BOOST_HW_SIMD_ARM_NEON_VERSION

4.7.3. BOOST_HW_SIMD_ARM_*_VERSION

这些定义代表 ARM SIMD 扩展版本。

必须将它们与预定义宏 BOOST_HW_SIMD_ARM 进行比较。= BOOST_HW_SIMD_ARM_NEON_VERSION

NEON ARM 扩展版本号。

版本号为:1.0.0

4.7.4. BOOST_HW_SIMD_PPC

PowerPC 的 SIMD 扩展(如果检测到)。版本号取决于检测到的最新扩展。

符号 版本

__VECTOR4DOUBLE__

检测

__ALTIVEC__

检测

__VEC__

检测

__VSX__

检测

符号 版本

__VECTOR4DOUBLE__

BOOST_HW_SIMD_PPC_QPX_VERSION

__ALTIVEC__

BOOST_HW_SIMD_PPC_VMX_VERSION

__VEC__

BOOST_HW_SIMD_PPC_VMX_VERSION

__VSX__

BOOST_HW_SIMD_PPC_VSX_VERSION

4.7.5. BOOST_HW_SIMD_PPC_*_VERSION

这些定义代表 Power PC SIMD 扩展版本。

必须将它们与预定义宏 BOOST_HW_SIMD_PPC 进行比较。= BOOST_HW_SIMD_PPC_VMX_VERSION

VMX PowerPC 扩展版本号。

版本号为:1.0.0。= BOOST_HW_SIMD_PPC_VSX_VERSION

VSX PowerPC 扩展版本号。

版本号为:1.1.0。= BOOST_HW_SIMD_PPC_QPX_VERSION

QPX PowerPC 扩展版本号。

版本号为:2.0.0

4.7.6. BOOST_HW_SIMD_X86

x86 的 SIMD 扩展(如果检测到)。版本号取决于检测到的最新扩展。

符号 版本

__SSE__

检测

_M_X64

检测

_M_IX86_FP >= 1

检测

__SSE2__

检测

_M_X64

检测

_M_IX86_FP >= 2

检测

__SSE3__

检测

__SSSE3__

检测

__SSE4_1__

检测

__SSE4_2__

检测

__AVX__

检测

__FMA__

检测

__AVX2__

检测

符号 版本

__SSE__

BOOST_HW_SIMD_X86_SSE_VERSION

_M_X64

BOOST_HW_SIMD_X86_SSE_VERSION

_M_IX86_FP >= 1

BOOST_HW_SIMD_X86_SSE_VERSION

__SSE2__

BOOST_HW_SIMD_X86_SSE2_VERSION

_M_X64

BOOST_HW_SIMD_X86_SSE2_VERSION

_M_IX86_FP >= 2

BOOST_HW_SIMD_X86_SSE2_VERSION

__SSE3__

BOOST_HW_SIMD_X86_SSE3_VERSION

__SSSE3__

BOOST_HW_SIMD_X86_SSSE3_VERSION

__SSE4_1__

BOOST_HW_SIMD_X86_SSE4_1_VERSION

__SSE4_2__

BOOST_HW_SIMD_X86_SSE4_2_VERSION

__AVX__

BOOST_HW_SIMD_X86_AVX_VERSION

__FMA__

BOOST_HW_SIMD_X86_FMA3_VERSION

__AVX2__

BOOST_HW_SIMD_X86_AVX2_VERSION

4.7.7. BOOST_HW_SIMD_X86_*_VERSION

这些定义代表 x86 SIMD 扩展版本。

必须将它们与预定义宏 BOOST_HW_SIMD_X86 进行比较。= BOOST_HW_SIMD_X86_MMX_VERSION

MMX x86 扩展版本号。

版本号为:0.99.0。= BOOST_HW_SIMD_X86_SSE_VERSION

SSE x86 扩展版本号。

版本号为:1.0.0。= BOOST_HW_SIMD_X86_SSE2_VERSION

SSE2 x86 扩展版本号。

版本号为:2.0.0。= BOOST_HW_SIMD_X86_SSE3_VERSION

SSE3 x86 扩展版本号。

版本号为:3.0.0。= BOOST_HW_SIMD_X86_SSSE3_VERSION

SSSE3 x86 扩展版本号。

版本号为:3.1.0。= BOOST_HW_SIMD_X86_SSE4_1_VERSION

SSE4_1 x86 扩展版本号。

版本号为:4.1.0。= BOOST_HW_SIMD_X86_SSE4_2_VERSION

SSE4_2 x86 扩展版本号。

版本号为:4.2.0。= BOOST_HW_SIMD_X86_AVX_VERSION

AVX x86 扩展版本号。

版本号为:5.0.0。= BOOST_HW_SIMD_X86_FMA3_VERSION

FMA3 x86 扩展版本号。

版本号为:5.2.0。= BOOST_HW_SIMD_X86_AVX2_VERSION

AVX2 x86 扩展版本号。

版本号为:5.3.0。= BOOST_HW_SIMD_X86_MIC_VERSION

MIC (Xeon Phi) x86 扩展版本号。

版本号为:9.0.0

4.7.8. BOOST_HW_SIMD_X86_AMD

x86 (AMD) 的 SIMD 扩展(如果检测到)。版本号取决于检测到的最新扩展。

符号 版本

__SSE4A__

检测

__FMA4__

检测

__XOP__

检测

BOOST_HW_SIMD_X86

检测

符号 版本

__SSE4A__

BOOST_HW_SIMD_X86_SSE4A_VERSION

__FMA4__

BOOST_HW_SIMD_X86_FMA4_VERSION

__XOP__

BOOST_HW_SIMD_X86_XOP_VERSION

BOOST_HW_SIMD_X86

BOOST_HW_SIMD_X86

此预定义宏包含所有其他 x86 SIMD 扩展,并且还包含其他更具体的扩展(FMA4、XOP、SSE4a)。您应该使用此预定义宏而不是 BOOST_HW_SIMD_X86 来测试是否检测到了这些特定扩展。

4.7.9. BOOST_HW_SIMD_X86_AMD_*_VERSION

这些定义代表 x86 (AMD 特定) SIMD 扩展版本。

必须将它们与预定义宏 BOOST_HW_SIMD_X86_AMD 进行比较。= BOOST_HW_SIMD_X86_AMD_SSE4A_VERSION

SSE4A x86 扩展(AMD 特定)。

版本号为:4.0.0。= BOOST_HW_SIMD_X86_AMD_FMA4_VERSION

FMA4 x86 扩展(AMD 特定)。

版本号为:5.1.0。= BOOST_HW_SIMD_X86_AMD_XOP_VERSION

XOP x86 扩展(AMD 特定)。

版本号为:5.1.1

4.8. 其他宏

4.8.1. BOOST_ENDIAN_*

检测字节序内存排序。此头文件中定义了四个宏,用于定义各种通常可能的字节序内存排序:

  • BOOST_ENDIAN_BIG_BYTE,字节交换的大端序。

  • BOOST_ENDIAN_BIG_WORD,字交换的大端序。

  • BOOST_ENDIAN_LITTLE_BYTE,字节交换的小端序。

  • BOOST_ENDIAN_LITTLE_WORD,字交换的小端序。

检测是保守的,它只识别它确切知道的字节序。特别是,双字节序不会被指示,因为除了操作系统提供的头文件外,无法从任何东西确定字节序。并且当前已知的头文件不定义可编程的双字节序可用。

此实现是各种公开可用信息和获得知识的汇编。

  1. “预定义编译器宏”中不可或缺的文档 字节序

  2. 维基百科的计算机体系结构页面中提供的各种字节序规范。

  3. 通常可用的搜索,用于定义字节序的头文件。

4.8.2. BOOST_ARCH_WORD_BITS

检测当前体系结构的本机字大小(以位为单位)。此检测有两种类型的宏:

  • BOOST_ARCH_WORD_BITS,给出字大小的位数(16、32、64)。

  • BOOST_ARCH_WORD_BITS_16, BOOST_ARCH_WORD_BITS_32, 和 BOOST_ARCH_WORD_BITS_64,指示检测到给定字大小时。

它们允许在代码中进行单次检查和直接使用大小。

字大小是手动确定每个体系结构的。因此,使用 wordsize.h 头文件也将包含所有体系结构头文件。

4.8.3. BOOST_PREDEF_WORKAROUND

BOOST_PREDEF_WORKAROUND(symbol,comp,major,minor,patch)

用法

#if BOOST_PREDEF_WORKAROUND(BOOST_COMP_CLANG,<,3,0,0)
    // Workaround for old clang compilers..
#endif

定义了一个与两个版本号的比较,该比较取决于 BOOST_STRICT_CONFIG 的定义。当定义了 BOOST_STRICT_CONFIG 时,它将展开为一个可转换为 false 的值。这将导致禁用所有由 BOOST_PREDEF_WORKAROUND 条件保护的代码。当 BOOST_STRICT_CONFIG 未定义时,它将展开以使用 comp 比较测试给定的 symbol 版本值与 BOOST_VERSION_NUMBER(major,minor,patch)

4.8.4. BOOST_PREDEF_TESTED_AT

BOOST_PREDEF_TESTED_AT(symbol,major,minor,patch)

用法

#if BOOST_PREDEF_TESTED_AT(BOOST_COMP_CLANG,3,5,0)
    // Needed for clang, and last checked for 3.5.0.
#endif

定义了一个与两个版本号的比较,该比较取决于 BOOST_STRICT_CONFIGBOOST_DETECT_OUTDATED_WORKAROUNDS 的定义。当定义了 BOOST_STRICT_CONFIG 时,它将展开为一个可转换为 false 的值。这将导致禁用所有由 BOOST_PREDEF_TESTED_AT 条件保护的代码。当 BOOST_STRICT_CONFIG 未定义时,它将展开为以下任一情况:

  • BOOST_DETECT_OUTDATED_WORKAROUNDS 未定义时,可转换为 true 的值。

  • BOOST_PREDEF_WORKAROUND(symbol, ⇐, major, minor, patch) 的展开为 trueBOOST_DETECT_OUTDATED_WORKAROUNDS 已定义时,可转换为 true 的值。

  • BOOST_PREDEF_WORKAROUND(symbol, >, major, minor, patch) 的展开为 trueBOOST_DETECT_OUTDATED_WORKAROUNDS 已定义时,将导致编译错误。

4.9. 版本定义宏

4.9.1. BOOST_VERSION_NUMBER

BOOST_VERSION_NUMBER(major,minor,patch)

定义标准的版本号,具有以下特性:

  • 十进制基整数,范围在 [0,1000000000) 之间。数字范围设计为允许 (2,2,5) 三元组。这适合 32 位值。

  • major 号在 [0,99] 范围内。

  • minor 号在 [0,99] 范围内。

  • patch 号在 [0,99999] 范围内。

  • 值可以以任何基数指定。因为定义的值是一个常量表达式。

  • 值可以直接用于预处理器和编译器表达式,以与其他类似定义的 值进行比较。

  • 该实现强制执行主版本号、次版本号和补丁版本号的个体范围。超出范围的值将被截断(取模)。

BOOST_VERSION_NUMBER_MAJOR(N), BOOST_VERSION_NUMBER_MINOR(N), BOOST_VERSION_NUMBER_PATCH(N)

这些宏从格式正确的版本号中提取主版本号、次版本号和补丁版本号,结果为一个预处理器表达式,其范围分别为 [0,99] 或 [0,99999],分别对应主版本号和次版本号,或补丁版本号。

4.9.2. BOOST_PREDEF_MAKE_..

这组宏用于分解常见的供应商版本号宏,这些宏由版本、修订和补丁数字组成。命名约定表示:

  • 指定版本号的基数。“BOOST_PREDEF_MAKE_0X”用于十六进制数字,而“BOOST_PREDEF_MAKE_10”用于十进制数字。

  • 供应商版本号的格式。其中“V”表示版本数字,“R”表示修订数字,“P”表示补丁数字,而“0”表示被忽略的数字。

宏为:

  • BOOST_PREDEF_MAKE_0X_VRP(V)

  • BOOST_PREDEF_MAKE_0X_VVRP(V)

  • BOOST_PREDEF_MAKE_0X_VRPP(V)

  • BOOST_PREDEF_MAKE_0X_VVRR(V)

  • BOOST_PREDEF_MAKE_0X_VRRPPPP(V)

  • BOOST_PREDEF_MAKE_0X_VVRRP(V)

  • BOOST_PREDEF_MAKE_0X_VRRPP000(V)

  • BOOST_PREDEF_MAKE_0X_VVRRPP(V)

  • BOOST_PREDEF_MAKE_10_VPPP(V)

  • BOOST_PREDEF_MAKE_10_VVPPP(V)

  • BOOST_PREDEF_MAKE_10_VR0(V)

  • BOOST_PREDEF_MAKE_10_VRP(V)

  • BOOST_PREDEF_MAKE_10_VRP000(V)

  • BOOST_PREDEF_MAKE_10_VRPPPP(V)

  • BOOST_PREDEF_MAKE_10_VRPP(V)

  • BOOST_PREDEF_MAKE_10_VRR(V)

  • BOOST_PREDEF_MAKE_10_VRRPP(V)

  • BOOST_PREDEF_MAKE_10_VRR000(V)

  • BOOST_PREDEF_MAKE_10_VV00(V)

  • BOOST_PREDEF_MAKE_10_VVR_0PPPPP(V, P),第二个参数指定年份-月份补丁级别,第一个数字被丢弃

  • BOOST_PREDEF_MAKE_10_VVRR(V)

  • BOOST_PREDEF_MAKE_10_VVRRP(V)

  • BOOST_PREDEF_MAKE_10_VVRRPP(V)

  • BOOST_PREDEF_MAKE_10_VVRRPPP(V)

  • BOOST_PREDEF_MAKE_10_VVRR0PP00(V)

  • BOOST_PREDEF_MAKE_10_VVRR0PPPP(V)

  • BOOST_PREDEF_MAKE_10_VVRR00PP00(V)

4.9.3. BOOST_PREDEF_MAKE_*.. 日期宏

日期分解宏返回相对于 1970 年 Epoch 日期的日期。如果月份不可用,则使用 1 月 1 日作为月份和日期。如果日期不可用但月份可用,则使用该月的第 1 天作为日期。

  • BOOST_PREDEF_MAKE_DATE(Y,M,D)

  • BOOST_PREDEF_MAKE_YYYYMMDD(V)

  • BOOST_PREDEF_MAKE_YYYY(V)

  • BOOST_PREDEF_MAKE_YYYYMM(V)

5. 检查实用程序

predef_check 实用程序提供了一个工具,用于构建一个程序,该程序将根据构建时检测到的定义来检查一组给定的表达式。

5.1. predef_check 程序

尽管只有一个 predef_check 程序,但存在针对 Predef 检测到的每种语言的变体,以匹配源文件的约定。对于所有这些程序,都通过一系列表达式参数来调用。表达式将在特定 predef_check 程序的上下文中进行评估,如果所有表达式都为真,则返回零(0)。否则,将返回第一个假表达式的索引。

表达式语法很简单:

predef-definition [ relational-operator version-value ]

predef-definition 可以是 Predef 定义中的任何一个。例如 BOOST_COMP_GCC

relational-operator 可以是以下任何一个: >, <, >=, , ==!=

version-number 可以是一个完整的或部分的版本三元组值。如果它是部分版本三元组,则用零补全。即 x.y 等同于 x.y.0,而 x 等同于 x.0.0

relations-operatorversion-number 可以省略。在这种情况下,它等同于

predef-definition > 0.0.0

5.2. 与 Boost.Build 一起使用

您可以直接从 Boost Build 使用 predef_check 程序来配置目标要求。这对于根据 Predef 中可用的详细版本信息控制项目构建内容非常有用。基本用法很简单:

import path-to-predef-src/tools/check/predef
    : check require
    : predef-check predef-require ;

exe my_windows_program : windows_source.cpp
    : [ predef-require "BOOST_OS_WINDOWS" ] ;

这个简单的用例将跳过构建 my_windows_program,除非正在为 Windows 构建。与直接的 predef_check 一样,您可以使用关系比较传递多个表达式。例如

import path-to-predef-src/tools/check/predef
    : check require
    : predef-check predef-require ;

lib my_special_lib : source.cpp
    : [ predef-require "BOOST_OS_WINDOWS != 0" "BOOST_OS_VMS != 0"] ;

在这种情况下,my_special_lib 仅在操作系统不是 Windows 或 VMS 时构建。requires 规则是 check 规则的一个特例。并在此基础上定义

rule require ( expressions + : language ? )
{
    return [ check $(expressions) : $(language) : : <build>no ] ;
}

表达式还可以使用显式的“and”、“or”逻辑运算符来实现更复杂的检查

import path-to-predef-src/tools/check/predef
    : check require
    : predef-check predef-require ;

lib my_special_lib : source.cpp
    : [ predef-require "BOOST_OS_WINDOWS" or "BOOST_OS_VMS"] ;

您可以使用 check 规则进行更多控制,并实现除控制构建内容之外的其他功能。check 规则的定义是

rule check ( expressions + : language ? : true-properties * : false-properties * )

当作为 Boost Build 目标的要求调用时,如果所有 expressions 都评估为 true,此规则将 true-properties 添加到目标。否则,将 false-properties 添加为要求。例如,您可以使用它来启用或禁用程序中的功能

import path-to-predef-src/tools/check/predef
    : check require
    : predef-check predef-require ;

exe my_special_exe : source.cpp
    : [ predef-check "BOOST_OS_WINDOWS == 0"
        : : <define>ENABLE_WMF=0
        : <define>ENABLE_WMF=1 ] ;

对于 checkrequirelanguage 参数控制使用哪个版本的 predef_check 程序来检查表达式。它默认为“c++”,但可以是以下任何一项:“c”、“cpp”、“objc”和“objcpp”。

6. 历史

6.1. 1.15.1

  • 防止使用过时的 predef/check/predef.jam B2 模块。而是使用当前的 predef/tools/check/predef.jam 模块。

  • 修复 architecture 工具检查规则返回 ppc 而不是 power

6.2. 1.15.0

  • 添加 Microsoft STL 检测(来自 Henrik Gaßmann)。

6.3. 1.14.0

  • 添加 LoongArch 检测(来自张娜)。

6.4. 1.13.1

  • 修复“epoch”拼写错误。

  • sparc.h 中添加缺失的括号(来自 tkoecker)。

  • 更新文档以使用 Rouge 代码样式和 Amber 一般样式。

6.5. 1.13

  • 添加 ARCH_PPC_64 predef。

  • 修复 ARCH_WORD_BITS* 重定义警告/错误。

  • 添加 ARCH_E2K,Elbrus 2000,架构(来自 Konstantin Ivlev)。

  • 修复未处理高于 10.x 版本号的最新 C++ 版本。

6.6. 1.12

  • 在 OpenBSD 上切换到使用 endian.h 头文件。(Brad Smith)

  • 修复未处理高于 9 版本号的最新 stdcxx 版本。

  • 修复直接包含子-BSD OS 头文件导致重定义警告。

  • 添加所有头文件直接包含的 CI 测试。

  • 在 FreeBSD 上为 clang 和 gcc 添加 CI 测试。

  • 添加 WORD_BITS predef 集合来检测架构字大小。最初的实现受 Mikhail Komarov 的提交启发。

  • 为 Cygwin 32 和 64 添加 CI 测试。

6.7. 1.11

  • 添加 BOOST_ARCH_RISCV。(来自 Andreas Schwab)

  • 添加 RISC-V 字节序检测。(来自 Thomas Petazzoni)

  • 将文档转换为 AsciiDoctor 格式。

  • 记录 C++ 标准的正确版本。

  • 修复在 WinCE 中构建时由于缺失头文件导致的编译错误。

  • 移除已弃用的 BOOST_OS_ANDROID

  • 修复 Wine 的编译。(Kevin Puetz)

6.8. 1.10

  • 修复从主 BSD 头文件错误包含子-BSD OS 头文件。

  • 修复使用已弃用的 TARGET_IPHONE_SIMULATOR 而不是较新的 TARGET_OS_SIMULATOR

  • 添加 BOOST_PLAT_ANDROID 以解决 Linux 和 Android OS predef 之间的冲突。BOOST_OS_ANDROID predef 现在已弃用,将在未来的版本中删除。

  • 添加支持将 Predef 作为 CMake 项目使用。

  • 添加支持将 Predef 作为独立的 B2 项目使用。

6.9. 1.9

  • 修复 BOOST_COMP_NVCC* predef。(来自 Benjamin Worpitz)

  • 为 Cygwin OS predef 添加特定的版本信息。(来自 James E. King III)

6.10. 1.8

  • 添加对 __ARM_ARCH 宏的支持。(来自 Tim Blechmann)

  • 添加 PTX 架构检测。(来自 Benjamin Worpitz)

  • 添加 nvcc 编译器检测。(来自 Benjamin Worpitz)

  • 添加对检测 CUDA 的支持。(来自 Benjamin Worpitz)

  • 移除对已弃用的 BOOST_ARCH_AMD64 的引用。(来自 Peter Kolbus)

6.11. 1.7

  • 修复 BOOST_ARCH_PARISK/BOOST_ARCH_PARISC 拼写错误。

  • 改进了 Windows 通用平台检测。(来自 James E. King, III)

  • 添加 CloudABI 与 cloudlibc 的检测。(来自 James E. King, III)

6.12. 1.6

  • 将 Intel C/C++ 版本 9999 的检测修复为 12.1.0。

  • 添加 BOOST_PREDEF_WORKAROUNDBOOST_PREDEF_TESTED_AT 宏,用于缺陷的规避和检测。

  • 添加 ARM64 MSVC SIMD 检测。(来自 Minmin Gong)

  • 添加 iOS 模拟器与设备之间的检测,作为平台选择。(来自 Ruslan Baratov)

  • 修复 MinGW 不正确的头文件保护。(来自 Ruslan Baratov)

6.13. 1.5

  • 修复 Intel C/C++ 编译器版本规格。

  • 添加 BOOST_VERSION_NUMBER_MAJORBOOST_VERSION_NUMBER_MINORBOOST_VERSION_NUMBER_PATCH 宏以从有效版本号中提取组件。

  • 更改 VS 版本编号。VS2015 及之后的版本将使用编译器版本而不是不同的产品版本。

6.14. 1.4.1

  • 对某些重定义错误和拼写错误的宏进行小的修复。

  • 稍微重新安排结构以符合当前库要求。

6.15. 1.4

  • 添加 SIMD 硬件检测。添加了 BOOST_HW_* 类别(来自 Charly Chevalier)。

  • 添加仅编译版本的检查实用程序以解决交叉编译用例。并更改了 BBv2 检查支持以使用仅编译检查。

  • 修复测试警告。

  • 修复 Windows 平台 AVAILABLE 宏的拼写错误。(来自 Vemund Handeland)

6.16. 1.3

  • 修复 predef_check 功能的许多问题。

  • 更新 SunPro 检测以适应 Oracle 的最新编译器版本。

  • 添加 Travis-CI 和 Appveyor 测试。

  • 在 Boost Build 端为 predef_check 表达式添加 andor 逻辑运算符。

  • 修复 BOOST_ARCH_PARISC 以正确拼写名称(来自 Graham Hanson)。

  • 修复 MAKE_YYYYM 宏以正确限制月份(来自 rick68)。

6.17. 1.2

  • 考虑 Visual Studio 产品版本与编译器版本之间的跳跃。这支持 2015 年及之后的 VS 版本。

  • 添加 Haiku OS 检测(来自 Jessica Hamilton)。

  • 修复 Android 字节序检测的一些问题(来自 mstahl-at-redhat.com)。

  • 添加缺失的 BOOST_PREDEF_MAKE_0X_VVRRPP 宏(来自 Erik Lindahl)。

  • 添加 predef_check 程序和 BBv2 集成以进行构建配置检查。

6.18. 1.1

  • 为 MinGW 和 Windows 平台变体添加 BOOST_PLAT_* 平台定义。

  • 检测 Windows 编译器的 ARM 架构,以定位 Windows 8 的移动设备。

  • 改进了 64 位 ARM 的 ARM 检测。

  • 添加了 iOS 作为操作系统进行检测。

  • 改进了某些平台上字节序的检测。

  • 为平台和编译器检测添加了独占和模拟定义。

此版本的主要变化是对定义进行了重构,以避免在单个类别中出现重复定义。也就是说,只有一个 BOOST_OS_*BOOST_COMP_*BOOST_PLAT_* 变体将被检测到(子类别除外)。

7. 待办事项

  • 改进参考文档。

8. 致谢

本库的全面性之所以成为可能,离不开“Pre-defined C/C++ Compiler Macros Project”这一不可或缺的资源。它过去是,并且现在仍然是构成本库的定义的主要来源。感谢 Bjorn Reese 和所有为该资源做出贡献的志愿者。

如果没有 Boost 社区在八年内提供的宝贵反馈,将本库打磨成可用形式,本库将是一团糟。特别是,我要感谢:Mathias Gaunard、Robert Stewart、Joël Lamotte、Lars Viklund、Nathan Ridge、Artyom Beilis、Joshua Boyce、Gottlob Frege、Thomas Heller、Edward Diener、Dave Abrahams、Iain Denniston、Dan Price、Ioannis Papadopoulos 和 Robert Ramey。感谢 Joel Falcou 管理本库的审查。

版权信息

根据 Boost Software License, Version 1.0 分发。(参见随附的 LICENSE_1_0.txt 文件或访问 https://boost.ac.cn/LICENSE_1_0.txt

Copyright 2005-2021 René Ferdinand Rivera Morell; Copyright 2015 Charly Chevalier; Copyright 2015 Joel Falcou