Как исключить ветви lcov внутри макроса

В моем коде есть несколько макросов для записи в лог:

#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

Есть ли хороший способ подавить эти ветви в самом макросе?

4

Решение

Почему бы не превратить макрос в функцию?

лайк:

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
}
1

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

новая версия 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");

который выживает перед зачисткой комментария прекомпилятора.

1

Я не могу понять, как прикрепить код к ответу, но это ответ на решение @ 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__);
0

Как насчет

#define LOG_MSG__LCOV_EXCL_BR_LINE LOG_MSG

а затем заменить любой LOG_MSG вызовы, которые вы не хотите проверять с помощью нового макроса LOG_MSG__LCOV_EXCL_BR_LINE, Будет ли это работать?

0
По вопросам рекламы [email protected]