我有 g++ 版本 4.8.4 编译器Xubuntu14.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 被缓冲(这意味着,据我所知,cerr 比 cout 慢);但是,无论如何,执行顺序不应该改变一下吗?那条空行从哪里来? (可能来自其中之一,但哪一个?)
有人可以解释一下这两行发生了什么吗?
太感谢了。
EDIT:我不用ubuntu,我用Xubuntu14.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-terminal 和 g++ 编译器获得了预期的输出(首先是 cerr,然后是 cout)。
使用Eclipse CDT时会出现此问题。我还想提醒大家,我从事 OpenCV 工作。
克里斯·多德的第四个建议:
“您的代码实际上与您上面发布的代码不同,并且差异虽然看似不重要,但实际上至关重要。”
当然,我的代码确实包含除我输入的内容之外的内容,但在这些行之前还有很多,我的意思是大量计算等。然而,可能有一些相关的部分是我之前没有意识到的。另外,我根本没有将 stdout 和/或 stderr 重定向到这些行之前的不同设备/文件/管道。
EDIT 2:当我在 Eclipse CDT 的调试模式下执行程序时,遵循装配线,
After cerr
行执行以下代码(当然还有其他汇编代码):
callq 0x403500 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
callq 0x403470 <_ZNSolsEi@plt>
callq 0x403770 <_ZNSolsEPFRSoS_E@plt>
After 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:当我注释掉除这两行之外的所有内容时,它按预期工作。因此,我的结论是,这些行之前可能有相关的代码部分,但我无法弄清楚它们。