C++:cout 和函数调用之间的计算顺序

C++: Order of evaluation between cout and a function call

本文关键字:计算 顺序 之间 函数调用 cout C++      更新时间:2023-10-16

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

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 并在以后恢复它。我希望屏幕上显示的唯一输出是"将标准重定向到/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 输出?

在这两种情况下,答案都是"缓冲"。 将输出发送到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输出换行符并刷新输出。