C++:cout 和函数调用之间的计算顺序
C++: Order of evaluation between cout and a function call
我经历了几个关于 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
输出换行符并刷新输出。
相关文章:
- 计算 I+V[i++] 的顺序是什么?
- 委派的 ctor 是否受参数计算顺序的影响?
- 函数参数计算顺序与 Lambda 捕获评估顺序
- 构造函数中初始化列表的计算顺序是否固定?
- 大括号和括号之间的参数计算顺序
- C++:cout 和函数调用之间的计算顺序
- 操作员 * 的计算顺序
- C++:计算顺序运算符时忽略括号
- C ,以下代码的计算顺序
- 使用参数和此关键字时的计算顺序
- 为什么在 c++ 中未指定函数参数的计算顺序
- 构造函数中成员启动列表的计算顺序
- C++嵌套的条件运算符计算顺序
- 赋值子表达式的计算顺序
- 初始化中的计算顺序
- 宏计算顺序
- C语言中等优先级操作数的计算顺序
- 移动语义和参数计算顺序
- 运算符优先级和计算顺序
- C++ 参数计算顺序