gpt4 book ai didi

C++:cout 和函数调用之间的求值顺序

转载 作者:行者123 更新时间:2023-11-30 05:06:16 28 4
gpt4 key购买 nike

我回答了几个关于 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 并稍后将其恢复。我希望屏幕上显示的唯一输出是“Redirecting std out to/dev/null”。但我看到的是“将 std 恢复为标准输出”。

似乎 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,它输出换行符并刷新输出。)

关于C++:cout 和函数调用之间的求值顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47995631/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com