首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何排除宏中的lcov分支

如何排除宏中的lcov分支
EN

Stack Overflow用户
提问于 2014-01-03 15:08:04
回答 5查看 5.8K关注 0票数 6

我的代码中有一些日志宏,大致如下:

代码语言:javascript
复制
#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不认识它,如果我把它放在那里。例如,此代码仍然生成分支。

代码语言:javascript
复制
#define LOG_MSG (pri, msg, ... ) \
    if (pri > PriorityLevel ) \
        printf( msg, ##\__VA_ARGS__);//LCOV_EXCL_LINE

有什么好方法来抑制宏本身中的这些分支吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-01-03 17:36:09

为什么不把宏变成函数呢?

像这样:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-01-06 15:25:39

我不知道如何将代码插入一个答案,但这是对@Jarod42的解决方案的响应。我没有使用C++0x,所以我稍微修改了他的解决方案:

代码语言:javascript
复制
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__);
票数 2
EN

Stack Overflow用户

发布于 2016-11-30 11:27:31

新的lcov版本1.11 (或1.12)引入了LCOV_EXCL_BR_LINE关键字。所以在你的情况下:

代码语言:javascript
复制
LOG_MSG(ERROR, "An Error has occurred\n"); //LCOV_EXCL_BR_LINE

或者更好的是:

代码语言:javascript
复制
LOG_MSG(ERROR, "An Error has occurred\n"); (void)("LCOV_EXCL_BR_LINE");

在预编译器注释剥离中幸存下来。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20906596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档