我的代码中有一些日志宏:
#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
有没有一种很好的方法来抑制宏本身的这些分支?
答案 0 :(得分:2)
新的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 :(得分:1)
为什么不将宏转为功能?
像:
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
}
答案 2 :(得分:0)
我无法弄清楚如何将代码添加到答案中,但这是对@ 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__);
答案 3 :(得分:0)
怎么样
#define LOG_MSG__LCOV_EXCL_BR_LINE LOG_MSG
然后替换您不希望使用新宏LOG_MSG
进行覆盖测试的所有LOG_MSG__LCOV_EXCL_BR_LINE
来电。那会有用吗?
答案 4 :(得分:0)
https://github.com/linux-test-project/lcov/issues/44#issuecomment-427449082
中提到的解决方案如何?更改lcovrc添加:
lcov_excl_br_line = LCOV_EXCL_BR_LINE|LOG_MSG