c++ - 为什么在打印某些内容时不保留顺序,首先使用 cerr 然后使用 cout?

标签 c++ std

我有 g++ 版本 4.8.4 编译器和 Xubuntu 14.04。在我的 OpenCV 代码(用 Eclipse CDT 编写)中,我连续写了以下三行:

/* Some codes here*/
cerr << "No match found. # of false positives: " << falsePositives << endl;
cout << "Press a key to continue..." << endl;
waitKey(0);

结果如下:

Press a key to continue...
No match found. # of false positives: 1
/*there is a blank line*/

为什么这两行的顺序在执行时改变了?前面几行中根本没有并行代码,但它们似乎(同时)并行工作。

我知道 cerr 没有缓冲,而 cout 有缓冲(这意味着,afaik,cerr 比 cout 慢);但是,不管怎样,执行的顺序不应该改变一下吗?那个空行是从哪里来的? (可能来自其中一个 endls,但是哪一个?)

谁能解释一下这两行是怎么回事?

非常感谢。

编辑: 我不使用 ubuntu,我使用 Xubuntu 14.04。对不起那个错误,我的头脑太乱了,但我认为这不会影响结果。 我使用 Eclipse 提供的控制台来显示它们。我试图将 std::前缀附加到所有 cout、cerr、endl。结果是一样的。

有趣的一点是,当我刚刚写了一个新文件时,包括:

#include <iostream>
#include <cstdlib>
int main()
{       
    std::cerr << "No match found. # of false positives: " << 2 << std::endl;
    std::cout << "Press a key to continue..." << std::endl;

    return 0;
}

我通过使用 xfce4 终端和 g++ 编译器获得了预期的输出(首先是 cerr,然后是 cout)。

问题出现在使用Eclipse CDT 时。我还想提醒大家,我在 OpenCV 上工作。

Chris Dodd 的第四条建议:

“您的代码实际上不同于您上面发布的代码,差异虽然看似不重要,但实际上至关重要。”

当然,我的代码确实包含我输入的内容以外的内容,但在这些行之前还有很多,我的意思是很多计算等。但是,可能有一些相关的部分是我之前无法意识到的。此外,我根本没有在这些行之前将 stdout 和/或 stderr 重定向到不同的设备/文件/管道。

编辑 2: 当我在 Eclipse CDT 的 Debug模式下执行程序时,遵循装配线,

cerr 行之后执行以下代码(当然还有其他汇编代码):

callq 0x403500 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
callq 0x403470 <_ZNSolsEi@plt>
callq 0x403770 <_ZNSolsEPFRSoS_E@plt>

cout 行之后执行以下代码(当然还有其他汇编代码):

callq 0x403500 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
callq 0x403770 <_ZNSolsEPFRSoS_E@plt>
callq 0x403670 <_ZN2cv7waitKeyEi@plt>

它们都给出相同的错误信息:

“std::basic_ostream >& std::operator<< >(std::basic_ostream >&, char const*)@plt at 0x403500”没有可用的源

并且该过程继续执行其他行的汇编代码而不会终止。

PS:当我注释掉除这两行以外的所有内容时,它按预期工作。因此,我的结论是,在这些行之前可能有相关的代码部分,但我无法弄明白。

最佳答案

std::cerrstd::cout 是不同的流,它们不同步。 所以你真的不能假设任何关于如何显示两者的输出。在这种情况下,输出恰好在错误之前显示。

可以依赖任一流的顺序。

此外,std::cout 是缓冲的而 std::cerr 不是,这通常会导致此类问题,但因为您正在使用 std::endl (刷新流)这并不适用于您的情况。

关于c++ - 为什么在打印某些内容时不保留顺序,首先使用 cerr 然后使用 cout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37884578/

相关文章:

c++ - 将 hana::tuple 中的类型转换为 hana::tuple 中的 std::vector<type>

c++ - 结构的动态聚合初始化的正确形式?

c++ - 多线程黑客

c++ - 在 Mac 上的 Xcode 中使用 C++ 中的堆栈、队列和链表的最简单方法是什么?

c++ - 使用 std::generate 生成矩阵

c++ - 如何编写标准的 C++ 迭代器?

c++ - 调用 std::vector::clear() 会将 std::vector::capacity() 设置为零吗?

c++ - to_string 未在范围内声明

c++ - 在 std::map 中存储指向派生类实例的指针

c++在辅助std线程上运行代码