我在使用Eclipse cdt时遇到了一个问题,我遇到了一个奇怪的行为:
cout << "Hello world" << endl;
aFunction();
// The output here is Hello world
// END
当我取消endl
输出时什么都不是
cout << "Hello world";
aFunction();
// No output
// END
当我稍后放endl
时,它可以正常工作:
cout << "Hello world";
aFunction();
cout << endl;
// output is Hello world
// END
现在,我无法提供功能代码,因为它需要我一千行。
然而,我尝试使用一个不执行任何操作的函数void toto(){}
并且没有这个奇怪的东西。
cout << "Hello world";
toto();
// Gives me Hello world
// END
我想知道的是什么可以导致这个?
编辑:
使用foo的测试单独测试(没有其他说明),
在其他测试中,我初始化了一个结构,我将其作为参数提供给aFunction
。该函数使用了一些元编程,我需要显示很多代码,以便您理解它。
答案 0 :(得分:4)
写入流时,它们通常是缓冲,这意味着输出存储在内部缓冲区(内存块)中。当该缓冲区已满时,或者明确告知流时,刷新缓冲区并将输出实际写入文件或设备。
std::endl
I/O manipulator不仅添加换行符,还会刷新流中的缓冲区,导致实际写入缓冲输出。
答案 1 :(得分:1)
std::endl
添加新行并刷新您提供给它的流。
您只需使用std::flush
刷新流。
答案 2 :(得分:0)
尝试拨打
std::ostream::flush()
刷新流缓冲区。这项工作由endl
完成,当你取消它时,消息在缓冲区中等待准备就绪,在缓冲区已满或新线路到来时刷新。
如果你愿意,你可以自己冲洗它。