我的代码中有一些日志宏,大致如下:
#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有什么好方法来抑制宏本身中的这些分支吗?
发布于 2014-01-03 17:36:09
为什么不把宏变成函数呢?
像这样:
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
}发布于 2014-01-06 15:25:39
我不知道如何将代码插入一个答案,但这是对@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__);发布于 2016-11-30 11:27:31
新的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");在预编译器注释剥离中幸存下来。
https://stackoverflow.com/questions/20906596
复制相似问题