C ++:cout和函数调用之间的评估顺序

时间:2017-12-27 16:37:52

标签: c++ c++11 cout

我经历了几个关于std :: cout评估顺序的问题,我知道std :: cout的args之间没有序列点,但是我无法理解以下代码是如何工作的:

saved_fd = dup(STDOUT_FILENO);
std::cout << "Redirecting std out to /dev/null";
redirect_stdout()
<do some stuff>
std::cout << "Restoring std out back to standard output";
restore_stdout();

我的函数redirect_stdout()和restore_stdout(),使用dup2调用将标准输出重定向到/ dev / null并稍后将其恢复。我希望屏幕上显示的唯一输出是“将std out重定向到/ dev / null”。但我所看到的是“恢复标准输出”。

似乎redirect_stdout()在前一个语句之前运行。

为了完整起见,以下是两种方法的定义:

void redirect_stdout()
{
  dump_fd = open("/dev/null", O_RDWR, 0777);
  dup2(dump_fd, STDOUT_FILENO);
  cout << endl;
}

void restore_stdout()
{
  dup2(saved_fd, STDOUT_FILENO);
  cout << endl;
}

为什么我看不到第一个cout输出?

1 个答案:

答案 0 :(得分:1)

在这两种情况下,答案都是“缓冲”。将输出发送到cout时,在缓冲区已满或直到刷新输出之前,它不会发送到文件描述符1。

修复是刷新输出:

saved_fd = dup(STDOUT_FILENO);
std::cout << "Redirecting std out to /dev/null" << std::flush;
redirect_stdout()
<do some stuff>
std::cout << "Restoring std out back to standard output" << std::flush;
restore_stdout();

(而不是std::flush,您还可以使用std::endl输出换行符并刷新输出。)