问题标签 [boost-preprocessor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
466 浏览

c++ - Boost.Preprocessor 可以实现二维序列吗?

Boost.PP 序列限制为 256 个元素。为了解决这个问题,我想使用二维序列或序列序列,其定义如下:

现在,为了提供一个类似BOOST_PP_SEQ_FOR的算法,我想像这样嵌套其中两个:

在第二个问题上,我收到了多个关于未声明标识符的错误:

错误 C2065:“ELEM_ID_OP”:未声明的标识符
错误 C2065:“MYFUNC”:未声明的标识符
错误 C2065:“零”:未声明的标识符
错误 C2065:“一”:未声明的标识符
错误 C2065:“二”:未声明的标识符

这是否意味着我的编译器的最大递归深度已达到,因此宏ELEM_ID_OP不再MYFUNC扩展?或者 Boost.PP 中是否有一个实现细节阻止它工作?有解决方法吗?

如果有帮助,我正在使用 VC++2013。

0 投票
0 回答
780 浏览

c++ - Boost 预处理器:访问元组序列中的元素

我正在尝试编写一些生成一些日志记录功能的增强预处理器宏。我目前有一个适用于简单序列的工作示例(即FUNC( (a)(b)(c)(d) )。)

如果我修改代码以使用元组序列(类似于BOOST_FUSION_ADAPT_STRUCT),则宏扩展将失败:

我知道这是因为元素现在是“元组”,导致宏 BOOST_PP_SEQ_FOR_EACH无法正确扩展。

我是预处理器元编程的新手,我不知道应该使用什么来正确扩展/提取所需数据。

0 投票
1 回答
801 浏览

c++ - 使用预处理器获取枚举的大小

我试图找到一种计算枚举长度的方法,而不是在枚举末尾添加一个“COUNT”元素。我找到了一种使用预处理器的方法,如下所示。

但是,当我尝试my_enum2按上述方式创建时,我从编译器(CygWin 上的 GCC 4.8.3)中得到一个重新声明错误,如下所示

如果我将有问题的行更改为,MAKE_ENUM(my_enum2, e)那么它可以干净地编译。任何想法这里有什么问题以及我该如何解决?提前致谢!

0 投票
1 回答
386 浏览

c++ - Boost Preprocessor 中的迭代限制

我正在使用 Boost::Test 框架为比较函数编写单元测试。对于每个测试用例,我创建一系列输入元素并成对比较它们以检查每对比较函数的返回值。我可以手动写出来,也可以写一个函数。在单元测试中编写函数并不好,因为当出现故障时我们得到的有用信息较少。手动写出每个检查会导致非常长的单元测试。所以我决定使用宏来遍历要检查的元素。它看起来像这样:

在部分排序但没有全部排序的测试用例中,我CHECK_NODE_LESS在适当的元素上使用宏来检查排序的元素,它工作正常。在总排序的测试用例中,我使用CHECK_NODE_ORDER宏。例如:

现在这个没有编译。我测试的第一件事是注释掉CHECK_NODE_LESS宏并运行预处理器以查看生成的内容。这是我所期望的:CHECK_NODE_LESS被要求使用正确的元素。然后我重新引入CHECK_NODE_LESS并运行预处理器,看看会发生什么。结果真的很丑,因为Boost Test中使用了宏,但是可以看出有些宏没有展开。

最后,我更改CHECK_NODE_LESS为以下内容,现在它工作正常:

我认为问题在于当我与其他宏一起使用时,Boost Preprocessor 库中存在一些迭代限制BOOST_CHECK_EQUAL,或者编译器中存在预处理器深度限制(我使用 Clang 3.4)。这个限制是多少,我该如何增加它?

0 投票
0 回答
139 浏览

c++ - 定义一个函数以返回 C++ 枚举定义的成员,作为预处理器宏的一部分?

给定一个定义为的枚举:

如何定义一个函数,该函数将被定义为 DEFINE_ENUM() 宏的一部分并返回一个包含枚举所有成员的向量?

以下,添加到上面的宏定义的末尾,与我到目前为止的内容一样接近:

但是,这是报告无效终止的宏定义,并声称如果包含它的文件包含在多个文件中,则每个 DEFINE_ENUM() 的 MembersOf() 都是多重定义的。

0 投票
2 回答
730 浏览

c++ - 如何使用 Boost 预处理器扩展字符串

我想用 Boost 的预处理器库扩展一个未知长度的字符串。

例如我想要这个:

由我的宏扩展为:

foo[0], foo[1], foo[2], '\0'

这是我的代码,我主要是从这里复制的:

我可以像这样使用它吗?

0 投票
2 回答
814 浏览

c++ - 从 Boost 1.55 更改为 1.57 后,Boost 预处理器程序将无法编译

我编写了一些预处理器指令来为类生成函数。使用 Boost 1.55 一切正常。当我尝试更改为 Boost 1.57 时,我遇到了一些奇怪的编译错误。

该程序是:

使用 gcc 4.9.1 我得到以下输出:

clang 3.5.0 对我说:

有谁知道我更改为 Boost 1.57 后出现了什么问题?

0 投票
1 回答
803 浏览

c++ - 基于宏的计数器

是否可以像这样创建编译时常量:

哪里SOME_EVENT会是0,哪里会SOME_OTHER_EVENT是1。

尝试了以下代码:

但是包含吃常量声明。

0 投票
1 回答
1700 浏览

c++ - 用表达式包装可变参数宏中的每个元素

问题:

我想写一个可变参数宏

其中,当使用令牌和 N 个参数调用时

将扩展为包含在令牌中的参数的逗号分隔列表

这将允许我编写如下内容:

如果我这样称呼它:

这将导致:

我不知道如何实现这一目标。可能吗?也许有BOOST_PP或一些这样的?

动机:

我有一个用于记录的宏:

我有一个可变参数类模板,它能够验证参数是否与提供的格式字符串匹配

如果我定义一个具有固定数量参数的宏,我可以调用我的格式检查函数:

但是,如果我使用可变参数宏,这将不适用于超过 1 个参数:

那是因为decltype(__VA_ARGS__)显然是无效的语法。

要修复它,我需要扩展__VA_ARGS__decltype(a1), decltype(a2), decltype(a3)

可变参数函数模板?

我尝试使用constexpr可变参数函数模板来实现这一点,但我无法传递fmt给 astatic_assert因为它此时不再是字符串文字:

试图调用这个检查函数

编译失败:

0 投票
1 回答
661 浏览

c++ - BOOST_PP 在空序列情况下展开序列

使用BOOST_PPI 可以将宏扩展为带有附加标记的多个逗号分隔值,如下面的代码所示。

但是,它在没有参数的情况下不起作用。

编译时的输出gcc -E main.cpp

如何MACRO在没有__VA_ARGS__参数的情况下将调用扩展到 null?

也就是说,我希望输出为:

我怎样才能做到这一点?