gpt4 book ai didi

c++ - 修改 TestAssert.h (cppunit) - 为什么包含的顺序对宏扩展很重要?

转载 作者:太空宇宙 更新时间:2023-11-04 14:08:14 24 4
gpt4 key购买 nike

我有一个项目有两个异常基类;两者具有相同的名称,只有方法/成员不同(一个有一个返回消息的方法,另一个只有一个字符串成员,可以访问该字符串成员以获取有关异常的信息)。

我正在使用 CPPUNIT 进行测试,在框架中有 TestAssert.hpp 文件,其中包含每个断言的宏(CPPUNIT_ASSERT_NO_THROW 等)。我修改了在其中添加另一个宏,该宏测试测试类中包含哪些异常 header ,因此我可以捕获我的基本异常;宏看起来像这样:

#ifdef BASE_EXCEPTION_CLASS_ONE_HPP
#define MY_CPPUNIT
catch (BaseException &ex) {
ex.getMessage();
}
#endif
#ifdef BASE_EXCEPTION_CLASS_TWO_HPP
#define MY_CPPUNIT
catch (BaseException &ex) {
cout << "Caught: " ex.comment <<endl;
}
#endif

这两个宏将在 TestAssert.h 中像这样使用

/** Asserts that the given expression does not throw any exceptions.
* \ingroup Assertions
* Example of usage:
* \code
* std::vector<int> v;
* v.push_back( 10 );
* CPPUNIT_ASSERT_NO_THROW( v.at( 0 ) );
* \endcode
*/
# define CPPUNIT_ASSERT_NO_THROW( expression ) \
try { \
expression; \
} catch ( const std::exception &e ) { \
CPPUNIT_NS::Message message( "Unexpected exception caught" ); \
message.addDetail( "Type: " + \
CPPUNIT_EXTRACT_EXCEPTION_TYPE_( e, \
"std::exception or derived" ) ); \
message.addDetail( std::string("What: ") + e.what() ); \
CPPUNIT_NS::Asserter::fail( message, \
CPPUNIT_SOURCELINE() ); } \
MY_CPPUNIT \
catch ( ... ) { \
CPPUNIT_NS::Asserter::fail( "Unexpected exception caught", \
CPPUNIT_SOURCELINE() ); \
}

这有效,但前提是在测试类中第一个#include 是#include "test.hpp"

那么,宏扩展如何受包含顺序的影响,或者我如何查看预处理部分以便以某种方式弄清楚?

非常感谢!

最佳答案

您可以只使用 gcc -E 查看预处理器后的输出。这包括所有扩展的宏,并让您看到宏扩展会发生什么。您还可以在第二步中编译该文件,如果问题最初出在其中一个宏中,则可以获得更好的错误报告。

关于c++ - 修改 TestAssert.h (cppunit) - 为什么包含的顺序对宏扩展很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16044340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com