是否可以将带有逗号的语句传递到提升测试宏中

Is it possible to pass a statement with a comma into a boost test macro?

本文关键字:测试 语句 是否      更新时间:2023-10-16

当我想对我用boost::test编写的小类进行单元测试时,我发现boost MACRO来检查/要求/....如果传递的语句包含",",则不能直接使用。

以下示例不会编译为预处理器报告macro "BOOST_CHECK_NO_THROW" passed 2 arguments, but takes just 1

BOOST_CHECK_NO_THROW({cache_map<int, int> test1(3);});

只是为了确认它来自我们用来分隔模板参数的逗号,我使用了以下内容,并且编译没有问题。

BOOST_CHECK_NO_THROW({string test1("test");});

解决方法是使用 typedef 别名而不是显式类型,但你有另一个想法吗?

对于简单的表达式,解决方案是将宏参数放在括号中,例如

BOOST_CHECK((std::is_same<int, int>::value));

但是,由于您在那里有一个块,因此该路由对您不开放(除非您不关心可移植性并且您的编译器接受它;例如,gcc 确实如此)。但是,知道表达式很好,我们可以用lambdas欺骗我们摆脱困境:

BOOST_CHECK_NO_THROW(([]{cache_map<int, int> test1(3);}()));

不过,您是否认为这比类型别名更漂亮取决于您。

与编译器相比,预处理器很简单,并且对它预处理的实际文本一无所知(它可以用于任何类型的文本文件,而不仅仅是 C 或 C++ 源文件)。这意味着它只是在宏调用中使用逗号作为参数分隔符,并且不能传递包含逗号的宏参数。

如您所述,解决特定问题的一种方法是使用类型别名。