我正在开发一个在单元测试中使用BOOST_CHECK_EXCEPTION的项目。第一个参数是代码块。当被测试的代码没有逗号时,它可以很好地工作。一旦代码获得了不在括号内的逗号(例如带有大括号和多个参数的构造函数调用),BOOST_CHECK_EXCEPTION将停止工作。预处理器将逗号视为参数分隔符。预处理程序知道括号,但不知道括号。
因此,包含无括号逗号的代码块被定义为BOOST_CHECK_EXCEPTION之外的lambda。可以,但是我正在寻找一种解决方案,以使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与包含无括号逗号的代码块一起使用?