Изменение TestAssert.h (cppunit) — почему порядок включения имеет значение для расширения макроса?

У меня есть проект, который имеет два базовых класса исключений; оба имеют одно и то же имя, отличаются только методы / члены (у одного есть метод, который возвращает сообщение, у другого — только строковый член, к которому можно обратиться за информацией об исключении).

Я использую 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»

Итак, как на расширение макроса влияет порядок включения или как я могу увидеть часть предварительной обработки, чтобы как-то понять это?

Большое спасибо!

1

Решение

Вы можете просто использовать gcc -E чтобы увидеть вывод после препроцессора. Это включает в себя все развернутые макросы и позволяет увидеть, что происходит с расширением макроса. Вы также можете скомпилировать этот файл на втором шаге и получить более качественные отчеты об ошибках, если проблема изначально была в одном из макросов.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector