首页 > 解决方案 > 在 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 宏,它将获取代码块并将其包装到包含括号的代码中。这些括号需要在所有预处理器扩展中幸存下来。forwhile在代码中使用括号,但我无法将代码块放入其中。同样,我无法在函数调用中获取代码块。他们都期待一个表情。

一种有效的方法是语句表达式。它是一个 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++unit-testingboostpreprocessor

解决方案


推荐阅读