是否有办法打开/关闭标准:cerr(或同等标准)? 不使用全面的日志库(或if语句)——C++中有没有方法有时将消息打印到控制台,有时不打印?
我使用的是是否有办法打开/关闭标准:cerr(或同等标准)? 不使用全面的日志库(或if语句)——C++中有没有方法有时将消息打印到控制台,有时不打印?,c++,visual-studio,visual-studio-2012,C++,Visual Studio,Visual Studio 2012,我使用的是std::cerr,是否有办法控制何时输出 理想情况下,我可以: std::cerr << "Constructor called" << endl; std::cerr我不知道你所说的“没有if”是什么意思,但是你可以自己编写代码而不用if。宏可以为您检查标志 #define CERR if (cerr_disabled) {} else std::cerr bool cerr_disabled = false; 然后,在代码中: CERR <<
std::cerr
,是否有办法控制何时输出
理想情况下,我可以:
std::cerr << "Constructor called" << endl;
std::cerr我不知道你所说的“没有if
”是什么意思,但是你可以自己编写代码而不用if
。宏可以为您检查标志
#define CERR if (cerr_disabled) {} else std::cerr
bool cerr_disabled = false;
然后,在代码中:
CERR << "error message" << std::endl;
如果cerr\u disabled
为true,则不会调用fancy\u log\u message()。这是仅通过抑制流对象本身无法实现的。我不确定“如果
没有”是什么意思,但您可以自己编写代码而不使用如果
。宏可以为您检查标志
#define CERR if (cerr_disabled) {} else std::cerr
bool cerr_disabled = false;
然后,在代码中:
CERR << "error message" << std::endl;
如果cerr\u disabled
为true,则不会调用fancy\u log\u message()。这是仅通过抑制流对象本身无法实现的。简单的方法是在流上设置/清除std::ios_base::failbit
:当设置std::ios_base::failbit
时,流不会做任何工作[除非输出运算符写得不正确]:
std::cerr.setstate(std::ios_base::failbit);
std::cerr << "this won't show\n";
std::cerr.clear();
std::cerr << "this will show!\n";
简单的方法是在流上设置/清除std::ios_base::failbit
:设置std::ios_base::failbit
时,流不会做任何工作[除非输出运算符写入错误]:
std::cerr.setstate(std::ios_base::failbit);
std::cerr << "this won't show\n";
std::cerr.clear();
std::cerr << "this will show!\n";
下面是一个没有宏的解决方案:
#include <iostream>
void toggle_cerr()
{
static std::streambuf* p = std::cerr.rdbuf();
std::cerr.rdbuf(std::cerr.rdbuf() ? nullptr : p);
}
int main()
{
toggle_cerr();
std::cerr << "str";
}
#包括
void toggle_cerr()
{
静态std::streambuf*p=std::cerr.rdbuf();
std::cerr.rdbuf(std::cerr.rdbuf()?nullptr:p);
}
int main()
{
切换_cerr();
std::cerr这是一个没有宏的解决方案:
#include <iostream>
void toggle_cerr()
{
static std::streambuf* p = std::cerr.rdbuf();
std::cerr.rdbuf(std::cerr.rdbuf() ? nullptr : p);
}
int main()
{
toggle_cerr();
std::cerr << "str";
}
#包括
void toggle_cerr()
{
静态std::streambuf*p=std::cerr.rdbuf();
std::cerr.rdbuf(std::cerr.rdbuf()?nullptr:p);
}
int main()
{
切换_cerr();
std::cerr何时调用该行,何时不调用该行?可能这只是通过使所有atderr输出静音来使程序静音?运行program 2>nul
是否提供所需的功能?我只想使用它进行调试(我可能不应该使用cerr,因为它指示错误)@kworr yes这是关于有一种打开/关闭调试消息的方法。你想在没有if
的情况下打开或关闭它吗?那么打开或关闭是什么意思?一个决定通常需要if
。该行何时调用,何时不应该调用?也许这只是通过使所有atderr输出静音来让程序静音ut?运行program 2>nul
是否提供了所需的功能?我只想使用它进行调试(我可能不应该使用cerr,因为它指示错误)@kworr yes这是关于有一种打开/关闭调试消息的方法。你想在不使用if
的情况下打开或关闭它吗?那么打开或关闭是什么意思?一个决定通常需要if
。此时实际上有相同的想法。此时实际上有相同的想法。这避免了使用宏,但你要支付i的费用调用@jxh:除了避免宏之外,还意味着不需要触摸std::cerr
的现有输出:一旦std::cerr
设置为禁用/启用,其他代码上的所有参数都会受到影响……但是,是的,所有参数都会被计算(并应用相应的副作用)这避免了使用宏,但您需要支付调用@jxh的费用:除了避免使用宏之外,还意味着不需要触及std::cerr
的现有输出:一旦std::cerr
设置为禁用/启用,其他代码上的所有参数都会受到影响……但是,是的,所有参数都是e评估(并应用相应的副作用)并调用运算符。此方法的缺点是此方法的缺点是