我有一个有两个基本异常类的项目;两者都有相同的名称,只有方法/成员不同(一个有一个返回消息的方法,另一个只有一个字符串成员,可以访问有关异常的信息)。
我正在使用CPPUNIT进行测试,在框架中有TestAssert.hpp文件,其中包含每个断言的宏(CPPUNIT_ASSERT_NO_THROW等)。我已经修改了添加另一个宏来测试测试类中包含哪些异常头,所以我可以捕获我的基本异常;宏看起来像这样:
#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”
那么,宏扩展如何受到包含顺序的影响,或者我怎样才能看到预处理部分,以便我能以某种方式解决它?
非常感谢!
答案 0 :(得分:0)
您可以使用gcc -E
查看预处理器之后的输出。这包括所有扩展的宏,让您了解宏扩展会发生什么。您还可以在第二步中编译该文件,如果问题最初位于其中一个宏中,则可以获得更好的错误报告。