c++ - 在 BOOST_CHECK_EXCEPTION 宏中使用逗号
问题描述
我正在开发一个在单元测试中使用 BOOST_CHECK_EXCEPTION 的项目。第一个参数是一个代码块。当被测代码没有逗号时,它运行良好。一旦代码得到一个不在括号内的逗号(例如,带有大括号和多个参数的构造函数调用),BOOST_CHECK_EXCEPTION 就会停止工作。预处理器将逗号视为参数分隔符。预处理器知道括号,但不知道大括号。
因此,包含不带括号的逗号的代码块被定义为 BOOST_CHECK_EXCEPTION 之外的 lambdas。那行得通,但是我正在寻找一种使 BOOST_CHECK_EXCEPTION 调用更加统一的解决方案。毕竟,随着代码的开发,逗号可以在表达式中出现和消失。
首先,只是在 BOOST_CHECK_EXCEPTION 扩展之后延迟逗号扩展是行不通的。BOOST_CHECK_EXCEPTION (BOOST_CHECK_THROW_IMPL) 的实现仍然会拒绝额外的参数。这意味着 BOOST_PP_COMMA 不会有帮助。
我考虑的一种方法是有一个 CODE_WRAPPER 宏,它将获取代码块并将其包装到包含括号的代码中。这些括号需要在所有预处理器扩展中幸存下来。for
并while
在代码中使用括号,但我无法将代码块放入其中。同样,我无法在函数调用中获取代码块。他们都期待一个表情。
一种有效的方法是语句表达式。它是一个 GNU 扩展,因此它将代码限制为 gcc 和 clang,这是不可取的。
Boost 文档建议使用do {...} while(0)
,但它不能解决逗号问题。https://www.boost.org/doc/libs/1_68_0/libs/test/doc/html/boost_test/utf_reference/testing_tool_ref/assertion_boost_level_exception.html
现在我正在考虑将 BOOST_CHECK_EXCEPTION 包装在一个宏中,该宏将为调用者透明地定义一个 lambda。我很惊讶我在网上看不到太多帮助。我觉得我错过了一些明显的东西。
是否有任何简单的方法可以将 BOOST_CHECK_EXCEPTION 与包含不带括号的逗号的代码块一起使用?
解决方案
推荐阅读
- c# - C# 将数据重定向到已经运行的控制台 exe
- python - Xlsxwriter,只格式化一些单元格,而不是整行或整列?
- java - 在java中将元素转换为对象不起作用
- docker - 如何将应用程序日志从 docker 容器转发到 Splunk?
- python - Altair 折线图中的工具提示
- list - Prolog:比较列表元素和总和
- c++ - C++ 中 fstream 的行为
- github - GitHub 与 IntelliJ(提交)
- grafana - 在 Grafana 中绘制两个 Prometheus 数据源值的总和
- powerbi - 如何使用每天更新的 Excel 创建 Power Bi 报告