首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++宏解析问题

C++宏解析问题
EN

Stack Overflow用户
提问于 2018-08-20 04:19:47
回答 1查看 377关注 0票数 1

我正在尝试使用一个宏来将一个单独的日志行本地排队到一个ostringstream中,然后在该行结束时转储该ostringstream的全部内容。然而,我仍然希望使用流插入语法。所以我想像这样翻转一条对数线:

代码语言:javascript
复制
std::cerr << "Some error in my function.  Code is " << errCode << " exiting" << std::endl;

...into this

代码语言:javascript
复制
SERR("Some error in my function.  Code is " << errCode << " exiting);

我有一些简单的方法可以很好的工作。直到我把它放在if-else语句中。很明显,我的宏不好,但我不知所措。

这是一个小的示例程序,用来说明这个问题:

代码语言:javascript
复制
#include <iostream>
#include <sstream>
#define SERR(x)     { std::ostringstream _s; ; _s << x << std::endl; std::cerr << _s.str(); }

int main()
{
    std::cout << "Hello World!\n"; 
    bool val = false;
    if (val)
        SERR("No error");
    else
        SERR("Error"); 
}

在此示例中,我从编译器获得的错误消息是:

1>c:\users\joe\source\repos\consoleapplication5\consoleapplication5\consoleapplication5.cpp(15):错误C2181:不匹配if的非法else

你知道我哪里搞错了吗?

(请注意,我现在不能使用第三方日志记录解决方案,所以它必须像这样简单。如果有必要,我可以将所有这些都保留为普通的std::cerr/std::cout/std::clog消息,但我更喜欢简单的消息,以最小化来自我的多线程应用程序的日志消息交错的机会。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-20 04:23:38

代码语言:javascript
复制
#include <iostream>
#include <sstream>

int main()
{
    std::cout << "Hello World!\n"; 
    bool val = false;
    if (val)
        { std::ostringstream _s; ; _s << "No error" << std::endl; std::cerr << _s.str(); };
    else
        { std::ostringstream _s; ; _s << "Error" << std::endl; std::cerr << _s.str(); };
}

请注意;是如何终止{ }块的

如果需要宏,则应始终使用do { } while (0)编写,如下所示:

代码语言:javascript
复制
#define SERR(x)                                     \
    do {                                            \
        std::ostringstream _s;                      \
        _s << (x) << std::endl;                     \
        std::cerr << _s.str();                      \
    } while (0)

这不仅解决了您的问题,而且还强制要求在宏后添加;。否则,人们可以通过两种方式使用它:

代码语言:javascript
复制
SERR("foo")  // without ;
...
SERR("bar"); // with ;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51921513

复制
相关文章

相似问题

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