是否有办法打开/关闭标准: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评估(并应用相应的副作用)并调用运算符。此方法的缺点是
此方法的缺点是