目录
欢迎使用可变宏数据库。
本文档 hereafter 简称 VMD 的可变宏数据库是一个可变宏库,它增强了 Boost 预处理器库 (Boost PP) 的功能,尤其是在与预处理器数据类型相关的方面。
在 Boost PP 库中,具有特定功能的预处理器数据类型是数字(0 到 BOOST_PP_LIMIT_MAG 之间的值)和复合数据类型 Boost PP 数组、Boost PP 列表、Boost PP 序列和 Boost PP 元组。
VMD 具有特定功能的预处理器数据类型与 Boost PP 库相同,此外还有以下预处理器数据类型:空、VMD 标识符、VMD 类型(标识符的子集)以及 VMD 序列,这是一个复合数据类型。序列是零个或多个之前提到的、由 VMD 库支持的预处理器数据类型,按顺序排列在一起。
VMD 库不以任何方式复制 Boost PP 数据类型的功能,但通过各种方式扩展了其中一些功能,同时还为 emptiness、VMD 标识符、VMD 类型和 VMD 序列提供了特定功能。
表 1.1。带有示例的数据类型
|
类型 |
示例 |
|---|---|
|
标识符 |
任意名称 |
|
number |
47 |
|
type |
BOOST_VMD_TYPE_NUMBER |
|
数组 |
(4,(an_identifier,156,BOOST_VMD_TYPE_IDENTIFIER)) |
|
list |
(78,(some_identifier,(BOOST_VMD_TYPE_TYPE,BOOST_PP_NIL))) |
|
序列 |
(identifier)(89)(245) |
|
tuple |
(any_id,175,BOOST_VMD_TYPE_LIST,happy,21) |
|
序列 |
tree 59 (56,BOOST_VMD_TYPE_SEQ) (128)(fire)(clown) (47,(BOOST_VMD_TYPE_TUPLE,BOOST_PP_NIL)) |
我们经常说一个宏扩展为空,或者一个宏被传递了空参数。与其使用“空”这个在 C++ 编程术语中有多种含义的词,不如将预处理器的这种机制称为“空”。
空是指没有任何预处理标记。一个扩展为空的宏,如
#define RETURN_NOTHING(x)
据称会返回空。反之,一个在调用时可以接受空的宏,例如
RETURN_NOTHING()
据称可以接受空,或不接受任何预处理标记。
最后,空可以作为任何复合数据类型的一部分,例如
(45,,some_name)
其中第二个 Boost PP 元组元素为空。
在 Boost PP 库中,相当多的功能集中在操作 Boost PP 数字上,特别是 0 和 1 的 Boost PP 数字作为布尔值,您可以使用 Boost PP 预处理逻辑在编写宏时采取不同的预处理路径。换句话说,在使用 Boost PP 时,宏的逻辑通常基于 Boost PP 数字的值。这是因为 Boost PP 数字可以与其他数字进行相等性或不等性比较,以及其他类型的比较,而利用这种比较 Boost PP 数字能力的 Boost PP 宏,例如 Boost PP 宏 BOOST_PP_IF 或 BOOST_PP_IIF,可以根据此类比较的结果选择不同的宏展开路径。
Boost VMD 库在 Boost PP 数字的比较基础上,增加了比较其任何其他数据类型的相等性或不等性的能力,从而允许宏的逻辑依赖于其支持的任何预处理器数据类型的值。
更重要的是,Boost VMD 库能够发现预处理数据的类型,如果该数据是 VMD 库支持的数据类型之一,这将使最终用户不仅能够根据支持的数据类型的值改变宏展开逻辑,还能根据预处理数据的实际类型改变宏展开逻辑。
根据宏参数的类型确定宏展开的能力,使宏程序员能够创建一个单一宏,该宏根据一个或多个参数的预处理数据类型以及特定类型参数的值而展开不同。这使得宏逻辑的设计更加灵活,可以依赖于数据类型和/或数据的 {0}。如果您对此感兴趣,请继续阅读,了解如何使用 VMD 进行宏编程。
该库的功能可以概括为:
该库是仅头文件的库,库中的所有宏都包含在一个名为 'vmd.hpp' 的单个头文件中。可以为库中不同的功能使用单独的头文件,在解释该功能时会进行说明。
库中的所有宏都以 'BOOST_VMD_' 开头,以区分最终用户可能使用的其他宏。因此,最终用户不应使用任何以 'BOOST_VMD_' 开头的 C++ 标识符,无论是宏还是其他。
使用该库仅依赖于 Boost PP。该库还使用 Boost detail lightweight_test.hpp 进行自身测试。