我正在尝试使用一个宏来将一个单独的日志行本地排队到一个ostringstream中,然后在该行结束时转储该ostringstream的全部内容。然而,我仍然希望使用流插入语法。所以我想像这样翻转一条对数线:
std::cerr << "Some error in my function. Code is " << errCode << " exiting" << std::endl;
...into this
SERR("Some error in my function. Code is " << errCode << " exiting);
我有一些简单的方法可以很好的工作。直到我把它放在if-else语句中。很明显,我的宏不好,但我不知所措。
这是一个小的示例程序,用来说明这个问题:
#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
消息,但我更喜欢简单的消息,以最小化来自我的多线程应用程序的日志消息交错的机会。)
发布于 2018-08-20 04:23:38
#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)
编写,如下所示:
#define SERR(x) \
do { \
std::ostringstream _s; \
_s << (x) << std::endl; \
std::cerr << _s.str(); \
} while (0)
这不仅解决了您的问题,而且还强制要求在宏后添加;
。否则,人们可以通过两种方式使用它:
SERR("foo") // without ;
...
SERR("bar"); // with ;
https://stackoverflow.com/questions/51921513
复制相似问题