В моем коде есть несколько макросов для записи в лог:
#define LOG_MSG (pri, msg, ... ) \
if (pri > PriorityLevel ) \
printf( msg, ##\__VA_ARGS__);
Я знаю, что могу использовать LCOV_EXCL_START, LCOV_EXCL_STOP или LCOV_EXCL_LINE для подавления ветви. Но это работает, только если я добавляю его в каждое место, которое я называю LOG_MSG:
LOG_MSG(ERROR, "An Error has occurred\n");//LCOV_EXCL_LINE
Я хотел бы включить этот комментарий в макрос, но LCOV не распознает его, если я добавлю его туда. Например, этот код все еще производит ветви.
#define LOG_MSG (pri, msg, ... ) \
if (pri > PriorityLevel ) \
printf( msg, ##\__VA_ARGS__);//LCOV_EXCL_LINE
Есть ли хороший способ подавить эти ветви в самом макросе?
Почему бы не превратить макрос в функцию?
лайк:
template <typename ... Ts>
void LOG_MSG(int priority, const std::string& message, Ts&&...ts)
{
if (priority > PriorityLevel)
printf(message.c_str(), std::forward<Ts>(ts)...);
// Or more appropriate stuff
}
новая версия lcov 1.11 (или 1.12) вводит ключевое слово LCOV_EXCL_BR_LINE. Итак, в вашем случае:
LOG_MSG(ERROR, "An Error has occurred\n"); //LCOV_EXCL_BR_LINE
или даже лучше:
LOG_MSG(ERROR, "An Error has occurred\n"); (void)("LCOV_EXCL_BR_LINE");
который выживает перед зачисткой комментария прекомпилятора.
Я не могу понять, как прикрепить код к ответу, но это ответ на решение @ Jarod42. Я не использую C ++ 0x, поэтому я немного изменил его решение:
void LogMsgFunc( U32 pri, const char* msg, ... )
{
//LCOV_EXCL_START
va_list variableArgumentList;
va_start( variableArgumentList, msg );
if ( pri <= PriorityLevel )
{
vfprintf( stderr, msg, variableArgumentList );
}
va_end( variableArgumentList );
//LCOV_EXCL_STOP
}
#define LOG_MSG (pri, msg, ... ) \
LogMsgFunc(pri, msg, ##__VA_ARGS__);
Как насчет
#define LOG_MSG__LCOV_EXCL_BR_LINE LOG_MSG
а затем заменить любой LOG_MSG
вызовы, которые вы не хотите проверять с помощью нового макроса LOG_MSG__LCOV_EXCL_BR_LINE
, Будет ли это работать?