【问题标题】:Modifying TestAssert.h (cppunit) - why the order of includes matter for macro expansion?修改 TestAssert.h (cppunit) - 为什么包含宏扩展的顺序很重要?
【发布时间】:2013-04-16 18:21:53
【问题描述】:

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

我正在使用 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"

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

非常感谢!

【问题讨论】:

  • 只是猜测,但包含的顺序可能会影响BASE_EXCEPTION_CLASS_ONE_HPPBASE_EXCEPTION_CLASS_TWO_HPP 是否在#ifdefs 查看它们的位置定义。但从这段代码中无法确定。

标签: c++ gcc macros cppunit


【解决方案1】:

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

【讨论】:

  • 我已经使用 gcc 和 -save-temps,看到了包含的顺序,但后来我有另一种解决问题的方法,放弃了宏的想法,并为所有异常类包含了 try-catch 块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 2018-02-01
  • 2017-06-27
相关资源
最近更新 更多