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 <boost/predef.h>
中,因此对预编译标头的使用很友好。 -
可以包含特定定义,例如
#include <boost/predef/os/windows.h>
用于单个检查。 -
预定义可以直接用于预处理器和编译器表达式中,以便与其他类似定义的值进行比较。
-
标头可以从支持 C 预处理器的多种语言中使用。特别是 C++、C、Objective C 和 Objective C++。
1.3. 设计选择
一个重要的设计选择是如何通过单个整数来表示编译器版本,以便在预处理指令中使用。让我们做一些计算。预处理常量表达式的“基本”有符号类型在 C90(和 C++,截至 2006 年)中是 long,在 C99 中是 intmax_t。类型 long 至少应能够表示数字 +2 147 483 647
。这意味着最高有效位只能是 0、1 或 2;如果我们希望所有十进制数字都可以在 0 到 9 之间变化,我们可以考虑的最大范围是 [0, 999 999 999\
]。均匀分配,这意味着每个版本号部分有 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 ) ...
参数是
-
主版本号,作为 [0,99] 范围内的常量值表达式。
-
次版本号,作为 [0,99] 范围内的常量值表达式。
-
补丁级别版本号,作为 [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
4. 参考
4.1. BOOST_ARCH
架构宏
4.1.1. BOOST_ARCH_ALPHA
DEC Alpha 架构。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
4.0.0 |
|
5.0.0 |
|
6.0.0 |
4.1.2. BOOST_ARCH_ARM
ARM 架构。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
V.0.0 |
|
V.0.0 |
|
V.0.0 |
|
V.0.0 |
|
8.0.0 |
|
8.0.0 |
|
8.0.0 |
|
8.0.0 |
|
7.0.0 |
|
7.0.0 |
|
7.0.0 |
|
7.0.0 |
|
6.0.0 |
|
6.0.0 |
|
6.0.0 |
|
6.0.0 |
|
5.0.0 |
|
5.0.0 |
|
4.0.0 |
|
4.0.0 |
4.1.3. BOOST_ARCH_BLACKFIN
来自 Analog Devices 的 Blackfin 处理器。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
4.1.4. BOOST_ARCH_CONVEX
Convex Computer 架构。
符号 | 版本 |
---|---|
|
检测 |
|
1.0.0 |
|
2.0.0 |
|
3.2.0 |
|
3.4.0 |
|
3.8.0 |
4.1.6. BOOST_ARCH_IA64
Intel Itanium 64 架构。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
4.1.7. BOOST_ARCH_M68K
Motorola 68k 架构。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
6.0.0 |
|
6.0.0 |
|
6.0.0 |
|
4.0.0 |
|
4.0.0 |
|
4.0.0 |
|
3.0.0 |
|
3.0.0 |
|
3.0.0 |
|
2.0.0 |
|
2.0.0 |
|
2.0.0 |
|
1.0.0 |
|
1.0.0 |
|
1.0.0 |
|
0.0.1 |
|
0.0.1 |
|
0.0.1 |
4.1.8. BOOST_ARCH_MIPS
MIPS 架构。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
V.0.0 |
|
1.0.0 |
|
1.0.0 |
|
2.0.0 |
|
2.0.0 |
|
2.0.0 |
|
3.0.0 |
|
3.0.0 |
|
4.0.0 |
|
4.0.0 |
4.1.9. BOOST_ARCH_PARISC
HP/PA RISC 架构。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
1.0.0 |
|
1.1.0 |
|
1.1.0 |
|
1.1.0 |
|
2.0.0 |
|
2.0.0 |
|
2.0.0 |
|
2.0.0 |
4.1.10. BOOST_ARCH_PPC
PowerPC 架构。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
6.1.0 |
|
6.1.0 |
|
6.3.0 |
|
6.3.0 |
|
6.4.0 |
|
6.4.0 |
4.1.11. BOOST_ARCH_PPC_64
PowerPC 64 位架构。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
4.1.15. BOOST_ARCH_RS6000
RS/6000 架构。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
4.1.16. BOOST_ARCH_SPARC
SPARC 架构。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
9.0.0 |
|
9.0.0 |
|
8.0.0 |
|
8.0.0 |
4.1.17. BOOST_ARCH_SH
SuperH 架构:如果可用版本 [1-5] 被专门检测到。
符号 | 版本 |
---|---|
|
检测 |
|
5.0.0 |
|
4.0.0 |
|
3.0.0 |
|
3.0.0 |
|
2.0.0 |
|
1.0.0 |
4.1.20. BOOST_ARCH_X86
Intel x86 架构。这是一个类别,指示检测到 BOOST_ARCH_X86_32
或 BOOST_ARCH_X86_64
。
4.1.22. BOOST_ARCH_X86_32
Intel x86 架构:如果可用版本 [3-6] 被专门检测到。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
V.0.0 |
|
V.0.0 |
|
6.0.0 |
|
5.0.0 |
|
4.0.0 |
|
3.0.0 |
4.1.23. BOOST_ARCH_X86_64
X86-64 架构。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
4.2. BOOST_COMP
编译器宏
4.2.1. BOOST_COMP_BORLAND
Borland C++ 编译器。版本号以主版本号、次版本号和补丁号提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.P |
|
V.R.P |
4.2.2. BOOST_COMP_CLANG
Clang 编译器。版本号以主版本号、次版本号和补丁号提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
4.2.4. BOOST_COMP_DEC
Compaq C/C++ 编译器。版本号以主版本号、次版本号和补丁号提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.P |
|
V.R.P |
4.2.5. BOOST_COMP_DIAB
Diab C/C++ 编译器。版本号以主版本号、次版本号和补丁号提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
4.2.7. BOOST_COMP_SYSC
Dignus Systems/C++ 编译器。版本号以主版本号、次版本号和补丁号提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
4.2.8. BOOST_COMP_EDG
EDG C++ Frontend 编译器。版本号以主版本号、次版本号和补丁号提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.0 |
4.2.9. BOOST_COMP_PATH
EKOpath 编译器。版本号以主版本号、次版本号和补丁号提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
4.2.10. BOOST_COMP_GNUC
Gnu GCC C/C++ 编译器。版本号以主版本号、次版本号和补丁号提供(如果可用)。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
|
V.R.0 |
4.2.12. BOOST_COMP_GHS
Green Hills C/C++ 编译器。版本号以主版本号、次版本号和补丁号提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.P |
|
V.R.P |
4.2.14. BOOST_COMP_IAR
IAR C/C++ 编译器。版本号以主版本号、次版本号和补丁号提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
4.2.15. BOOST_COMP_IBM
IBM XL C/C++ 编译器。版本号以主版本号、次版本号和补丁号提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
V.R.P |
|
V.R.P |
|
V.R.P |
|
V.R.P |
4.2.16. BOOST_COMP_INTEL
Intel C/C++ 编译器。版本号以主版本号、次版本号和补丁号提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
V.R |
|
V.R.P |
ℹ
|
由于 Intel 在发布版本编号中的错误,当 __INTEL_COMPILER 为 9999 时,它被检测为版本 12.1.0。 |
4.2.20. BOOST_COMP_MWERKS
Metrowerks CodeWarrior 编译器。版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.P |
|
V.R.P >= 4.2.0 |
|
9.R.0 |
|
8.R.0 |
4.2.22. BOOST_COMP_MPW
MPW C++ 编译器。版本号以主版本号和次版本号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
V.R.0 |
4.2.23. BOOST_COMP_NVCC
NVCC 编译器。版本号以主版本号、次版本号和补丁号的形式提供,从 7.5 版本开始。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
4.2.25. BOOST_COMP_PGI
Portland Group C/C++ 编译器。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
4.2.26. BOOST_COMP_SGI
SGI MIPSpro 编译器。版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.P |
|
V.R.P |
4.2.27. BOOST_COMP_SUNPRO
Oracle Solaris Studio 编译器。版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.P |
|
V.R.P |
|
VV.RR.P |
|
VV.RR.P |
4.2.29. BOOST_COMP_MSVC
Microsoft Visual C/C++ 编译器。版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
|
V.R.0 |
ℹ
|
2015 年之后的 Visual Studio 版本将不再被 Boost Predef 识别为市场营销版本号。相反,我们直接使用编译器版本号,即 _MSC_VER 号。 |
4.3. BOOST_LANG
语言标准宏
4.3.1. BOOST_LANG_CUDA
CUDA C/C++ 语言。如果可用,版本以 VV.RR.P 的形式检测。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
VV.RR.P |
4.3.3. BOOST_LANG_STDC
Standard C 语言。如果可用,标准的年份将从 Epoch 日期检测为 YYYY.MM.1。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
4.3.4. BOOST_LANG_STDCPP
Standard C++ 语言。如果可用,标准的年份将从 Epoch 日期检测为 YYYY.MM.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 |
符号 | 版本 |
---|---|
|
检测 |
|
YYYY.MM.1 |
4.3.5. BOOST_LANG_STDCPPCLI
Standard C++/CLI 语言。如果可用,标准的年份将从 Epoch 日期检测为 YYYY.MM.1。
符号 | 版本 |
---|---|
|
检测 |
|
YYYY.MM.1 |
4.4. BOOST_LIB
库宏
4.4.1. BOOST_LIB_C_CLOUDABI
cloudlibc - CloudABI 的标准 C 库。版本号以主版本号和次版本号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.0 |
4.4.2. BOOST_LIB_C_GNU
GNU glibc 标准 C 库。版本号以主版本号和次版本号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.0 |
|
V.R.0 |
4.4.3. BOOST_LIB_C_UC
uClibc 标准 C 库。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
4.4.5. BOOST_LIB_C_ZOS
z/OS libc 标准 C 库。版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
|
V.R.P |
4.4.7. BOOST_LIB_STD_DINKUMWARE
Dinkumware 标准 C++ 库。如果可用,版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.0 |
4.4.8. BOOST_LIB_STD_COMO
Comeau Computing 标准 C++ 库。版本号以主版本号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.0.0 |
4.4.9. BOOST_LIB_STD_MSIPL
Modena Software Lib++ 标准 C++ 库。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
4.4.10. BOOST_LIB_STD_MSL
Metrowerks 标准 C++ 库。版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.P |
|
V.R.P |
4.4.11. BOOST_LIB_STD_RW
Roguewave 标准 C++ 库。如果可用,版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.P |
4.4.12. BOOST_LIB_STD_SGI
SGI 标准 C++ 库。如果可用,版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.P |
4.4.13. BOOST_LIB_STD_GNU
GNU libstdc++ 标准 C++ 库。版本号以年(从 1970 年开始)、月和日的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.P |
|
V.R.P |
4.4.14. BOOST_LIB_STD_STLPORT
STLport Standard C++ 库。版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.P |
|
V.R.P |
|
V.R.P |
4.4.16. BOOST_LIB_STD_MSVC
Microsoft’s C++ Standard Library。如果可用,版本号以主版本号、次版本号和补丁号的形式提供。补丁号从 _MSVC_STL_UPDATE
中派生,取其最后五位数字(见下文)。这意味着将 _MSVC_STL_UPDATE
值粘贴到 BOOST_VERSION_NUMBER
将生成一个可以直接与 BOOST_LIB_STD_MSVC
进行比较的版本号。
符号 | 版本 |
---|---|
|
检测 |
|
VV.R.0 |
|
00.0.0YYYMM |
4.5. BOOST_OS
操作系统宏
4.5.1. BOOST_OS_AIX
IBM AIX 操作系统。版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
4.3.0 |
|
4.1.0 |
|
3.2.0 |
|
3.0.0 |
4.5.4. BOOST_OS_BSD
BSD 操作系统。
BSD 有各种分支操作系统,每个分支操作系统都单独检测。这会检测以下变体,并设置特定的版本号宏以匹配
-
BOOST_OS_BSD_DRAGONFLY
DragonFly BSD -
BOOST_OS_BSD_FREE
FreeBSD -
BOOST_OS_BSD_BSDI
BSDi BSD/OS -
BOOST_OS_BSD_NET
NetBSD -
BOOST_OS_BSD_OPEN
OpenBSD
ℹ
|
通用的 BOOST_OS_BSD 在所有情况下都会设置,以指示某种形式的 BSD。如果检测到上述变体,也会设置相应的宏。 |
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
4.2.0 |
|
4.3.0 |
|
4.4.0 |
|
V.R.0 |
4.5.5. BOOST_OS_CYGWIN
Cygwin 环境。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.0 |
4.5.8. BOOST_OS_IOS
iOS 操作系统。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__*1000 |
4.5.11. BOOST_OS_MACOS
Mac OS 操作系统。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
10.0.0 |
|
9.0.0 |
4.5.13. BOOST_OS_QNX
QNX 操作系统。版本号以主版本号和次版本号的形式提供(如果可能)。并且专门检测版本 4。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.0 |
|
4.0.0 |
4.5.18. BOOST_OS_WINDOWS
Microsoft Windows 操作系统。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
4.5.22. BOOST_OS_BSD_NET
NetBSD 操作系统。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.P |
|
0.8.0 |
|
0.9.0 |
|
1.0.0 |
|
V.R.P |
4.5.23. BOOST_OS_BSD_OPEN
OpenBSD 操作系统。
符号 | 版本 |
---|---|
|
检测 |
|
2.0.0 |
|
2.1.0 |
|
2.2.0 |
|
2.3.0 |
|
2.4.0 |
|
2.5.0 |
|
2.6.0 |
|
2.7.0 |
|
2.8.0 |
|
2.9.0 |
|
3.0.0 |
|
3.1.0 |
|
3.2.0 |
|
3.3.0 |
|
3.4.0 |
|
3.5.0 |
|
3.6.0 |
|
3.7.0 |
|
3.8.0 |
|
3.9.0 |
|
4.0.0 |
|
4.1.0 |
|
4.2.0 |
|
4.3.0 |
|
4.4.0 |
|
4.5.0 |
|
4.6.0 |
|
4.7.0 |
|
4.8.0 |
|
4.9.0 |
|
5.0.0 |
|
5.1.0 |
|
5.2.0 |
|
5.3.0 |
|
5.4.0 |
|
5.5.0 |
|
5.6.0 |
|
5.7.0 |
|
5.8.0 |
|
5.9.0 |
|
6.0.0 |
|
6.1.0 |
|
6.2.0 |
|
6.3.0 |
|
6.4.0 |
|
6.5.0 |
|
6.6.0 |
|
6.7.0 |
|
6.8.0 |
|
6.9.0 |
4.6. BOOST_PLAT
平台宏
4.6.5. BOOST_PLAT_MINGW
MinGW 平台,任何变体。版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
V.R.0 |
|
V.R.0 |
4.6.6. BOOST_PLAT_MINGW32
MinGW 平台。版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.0 |
4.6.7. BOOST_PLAT_MINGW64
MinGW-w64 平台。版本号以主版本号、次版本号和补丁号的形式提供。
符号 | 版本 |
---|---|
|
检测 |
|
V.R.0 |
4.6.8. BOOST_PLAT_WINDOWS_DESKTOP
UWP 用于 Windows 桌面开发。如果 Platform SDK 版本过旧,不支持 UWP 也可用。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
4.6.9. BOOST_PLAT_WINDOWS_PHONE
UWP 用于 Windows Phone 开发。
符号 | 版本 |
---|---|
|
检测 |
4.6.10. BOOST_PLAT_WINDOWS_RUNTIME
已弃用。
UWP 用于 Windows Phone 或应用商店开发。这与 UWP 的现有开发模型不符,已被弃用。请改用其他 BOOST_PLAT_WINDOWS_*
定义之一。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
4.6.11. BOOST_PLAT_WINDOWS_SERVER
UWP 用于 Windows Server 开发。
符号 | 版本 |
---|---|
|
检测 |
4.6.12. BOOST_PLAT_WINDOWS_STORE
UWP 用于 Windows 应用商店开发。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
4.6.13. BOOST_PLAT_WINDOWS_SYSTEM
UWP 用于 Windows System 开发。
符号 | 版本 |
---|---|
|
检测 |
4.6.14. BOOST_PLAT_WINDOWS_UWP
Universal Windows Platform 在当前开发环境能够以 UWP 开发为目标时可用。
符号 | 版本 |
---|---|
|
|
|
|
4.7. BOOST_HW
硬件宏
4.7.1. 使用 BOOST_HW_SIMD_*
预定义宏
SIMD 预定义宏取决于编译器选项。例如,您必须向 clang 或 gcc 添加 -msse3
选项才能启用 SSE3。SIMD 预定义宏也是包含性的。这意味着如果启用了 SSE3,则每个版本号较低的扩展都将被隐式启用和检测。但是,某些扩展是 CPU 特定的,当启用更高版本时,它们可能不会被检测到或启用。
ℹ
|
使用 x86-64 架构时,SSE(1) 和 SSE2 会自动默认启用。 |
要检查是否已启用任何 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 here]。 |
4.7.2. BOOST_HW_SIMD_ARM
ARM 的 SIMD 扩展(如果检测到)。版本号取决于最近检测到的扩展。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
符号 | 版本 |
---|---|
|
BOOST_HW_SIMD_ARM_NEON_VERSION |
|
BOOST_HW_SIMD_ARM_NEON_VERSION |
|
BOOST_HW_SIMD_ARM_NEON_VERSION |
|
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 扩展(如果检测到)。版本号取决于最近检测到的扩展。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
符号 | 版本 |
---|---|
|
BOOST_HW_SIMD_PPC_QPX_VERSION |
|
BOOST_HW_SIMD_PPC_VMX_VERSION |
|
BOOST_HW_SIMD_PPC_VMX_VERSION |
|
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 扩展(如果检测到)。版本号取决于最近检测到的扩展。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
|
检测 |
符号 | 版本 |
---|---|
|
BOOST_HW_SIMD_X86_SSE_VERSION |
|
BOOST_HW_SIMD_X86_SSE_VERSION |
|
BOOST_HW_SIMD_X86_SSE_VERSION |
|
BOOST_HW_SIMD_X86_SSE2_VERSION |
|
BOOST_HW_SIMD_X86_SSE2_VERSION |
|
BOOST_HW_SIMD_X86_SSE2_VERSION |
|
BOOST_HW_SIMD_X86_SSE3_VERSION |
|
BOOST_HW_SIMD_X86_SSSE3_VERSION |
|
BOOST_HW_SIMD_X86_SSE4_1_VERSION |
|
BOOST_HW_SIMD_X86_SSE4_2_VERSION |
|
BOOST_HW_SIMD_X86_AVX_VERSION |
|
BOOST_HW_SIMD_X86_FMA3_VERSION |
|
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 扩展(如果检测到)。版本号取决于最近检测到的扩展。
符号 | 版本 |
---|---|
|
检测 |
|
检测 |
|
检测 |
|
检测 |
符号 | 版本 |
---|---|
|
BOOST_HW_SIMD_X86_SSE4A_VERSION |
|
BOOST_HW_SIMD_X86_FMA4_VERSION |
|
BOOST_HW_SIMD_X86_XOP_VERSION |
|
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
,字交换小端序。
检测是保守的,因为它只识别它确定知道的字节序。特别是,双端序没有指示,因为它实际上不可能从操作系统提供的标头以外的任何东西确定字节序。并且当前已知的标头未定义程序化双端序是否可用。
此实现是各种公开可用的信息和已获得知识的汇编
-
“预定义的编译器宏”的不可或缺的文档 Endianness。
-
Wikipedia 计算机架构页面中提供的各种字节序规范。
-
通常可用的用于搜索定义字节序的标头。
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_CONFIG
和 BOOST_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)
的扩展为true
且定义了BOOST_DETECT_OUTDATED_WORKAROUNDS
时,可转换为true
的值。 -
当
BOOST_PREDEF_WORKAROUND(symbol, >, major, minor, patch)
的扩展为 true 且定义了BOOST_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)
5. 检查实用程序
predef_check
实用程序提供了一种工具,用于构建程序,该程序将根据构建时检测到的定义来检查给定的一组表达式。
5.1. predef_check
程序
尽管只有一个 predef_check
程序,但 Predef 检测到的每种语言都有变体,以匹配源文件的约定。对于所有这些变体,都可以使用表达式参数列表来调用。表达式在特定 predef_check
程序的上下文中求值,如果所有表达式都为真(0),则返回零 (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-operator 和 version-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" ] ;
除非为 Windows 构建,否则简单的用例将跳过构建 my_windows_program
。与直接 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"] ;
在这种情况下,只有当操作系统不是 Windows 或 VMS 时,才会构建 my_special_lib
。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 目标的 requirement 调用时,如果所有 expressions
的求值结果都为真,则此规则会将 true-properties
添加到目标。否则,false-properties
将作为 requirement 添加。例如,您可以使用它来启用或禁用程序中的功能
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 ] ;
对于 check
和 require
,language
参数控制使用哪个变体的 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.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 操作系统头文件导致重新定义警告的问题。
-
添加对直接包含所有头文件的 CI 测试。
-
为 clang 和 gcc 添加在 FreeBSD 上的 CI 测试。
-
添加
WORD_BITS
predefs 集合,以检测架构字大小。初始实现灵感来自 Mikhail Komarov 的提交。 -
为 Cygwin 32 和 64 添加 CI 测试。
6.7. 1.11
-
添加
BOOST_ARCH_RISCV
。(来自 Andreas Schwab) -
添加 RISC-V endian 检测。(来自 Thomas Petazzoni)
-
将文档转换为 AsciiDoctor 格式。
-
记录 C++ 标准的正确版本。
-
修复在 WinCE 中构建时由于头文件不可用而导致的编译错误。
-
移除已弃用的
BOOST_OS_ANDROID
。 -
修复 Wine 的编译问题。(Kevin Puetz)
6.8. 1.10
-
修复从主 BSD 头文件错误包含子 BSD 操作系统头文件的问题。
-
修复使用已弃用的
TARGET_IPHONE_SIMULATOR
而不是较新的TARGET_OS_SIMULATOR
的问题。 -
添加
BOOST_PLAT_ANDROID
以解决 Linux 和 Android OS predefs 之间的冲突。BOOST_OS_ANDROID
predef 现在已弃用,将在未来版本中移除。 -
添加对将 Predef 作为 CMake 项目使用的支持。
-
添加对将 Predef 作为独立 B2 项目使用的支持。
6.9. 1.9
-
修复
BOOST_COMP_NVCC*
predefs 的问题。(来自 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)
-
添加对使用 cloudlibc 的 CloudABI 的检测。(来自 James E. King, III)
6.12. 1.6
-
修复 Intel C/C++ 版本 9999 检测为 12.1.0 的问题。
-
添加
BOOST_PREDEF_WORKAROUND
和BOOST_PREDEF_TESTED_AT
宏,用于缺陷解决方法和检测。 -
添加 ARM64 MSVC SIMD 检测。(来自 Minmin Gong)
-
添加对 iOS 模拟器与设备作为平台选择的检测。(来自 Ruslan Baratov)
-
修复 MinGW 不正确的头文件保护。(来自 Ruslan Baratov)
6.13. 1.5
-
修复 Intel C/C++ 编译器版本规范。
-
添加
BOOST_VERSION_NUMBER_MAJOR
、BOOST_VERSION_NUMBER_MINOR
、BOOST_VERSION_NUMBER_PATCH
宏,以从有效版本号中提取组件。 -
更改 VS 版本编号。VS2015 之后的版本将使用编译器版本而不是不同的产品版本。
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
表达式添加and
和or
逻辑运算符。 -
修复
BOOST_ARCH_PARISC
为正确拼写的名称(来自 Graham Hanson)。 -
修复
MAKE_YYYYM
宏以正确限制月份(来自 rick68)。
8. 致谢
如果没有 预定义的 C/C++ 编译器宏 项目这个不可或缺的资源的存在,这个库的全面性是不可能实现的。它曾经是,并将继续是构成这个库的定义的主要来源。感谢 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 软件许可协议 1.0 版分发。(请参阅随附的文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)
版权所有 2005-2021 René Ferdinand Rivera Morell;版权所有 2015 Charly Chevalier;版权所有 2015 Joel Falcou