C++ 标准输出异常行为

C++ 标准输出异常行为,c++,c++11,eclipse-cdt,C++,C++11,Eclipse Cdt,我在使用Eclipse cdt时遇到了一个问题,我面临一个奇怪的行为: cout << "Hello world" << endl; aFunction(); // The output here is Hello world // END 当我稍后放置endl时,效果很好: cout << "Hello world"; aFunction(); cout << endl; // output is Hello world // END 我想知

我在使用Eclipse cdt时遇到了一个问题,我面临一个奇怪的行为:

cout << "Hello world" << endl;
aFunction();
// The output here is Hello world
// END
当我稍后放置endl时,效果很好:

cout << "Hello world";
aFunction();
cout << endl;
// output is Hello world
// END
我想知道是什么导致了这个

编辑: 使用foo的测试是单独测试的,没有其他说明,
在其他测试中,我初始化了一个作为函数参数的结构。该函数使用了一些元编程,我需要展示大量代码,以便您理解。

在写入流时,它们通常是缓冲的,这意味着输出存储在内存的内部缓冲块中。当该缓冲区已满时,或者当显式通知流时,缓冲区将被刷新,输出将实际写入文件或设备

不仅添加新行,还刷新流中的缓冲区,导致缓冲输出被实际写入。

std::endl添加新行并刷新您提供给它的流

您可以使用std::flush刷新流。

尝试调用

std::ostream::flush()
刷新流缓冲区。这项工作是由endl完成的,当您取下它时,消息会一直在缓冲区中等待就绪,以便在缓冲区已满或新行出现时刷新


因此,如果您愿意,您可以自己刷新它。

那么为什么我不需要toto函数呢?@OthmanBenchekroun没有更多上下文,很难知道。例如,函数调用后会发生什么?执行函数调用的程序是否继续,执行toto调用的程序是否退出?流缓冲区在被销毁时被刷新,对于std::cout缓冲区来说,是在程序退出时刷新的。调用toto后会发生什么?您能编辑您的问题以包含完整的程序吗?@JoachimPileborg editted因为程序退出时流缓冲区被刷新,并且程序在函数调用完成后干净地退出,这意味着应该显示输出。您确定A功能正确完成吗?它不会崩溃或导致程序异常退出?当我添加cout@JoachimPileborg时,它实际上是我之前初始化的结构。。。它的析构函数crashes@OthmanBenchekroun流缓冲是非常不确定的,所以用另一个函数替换一个函数可能会改变它的行为。运行时环境可能不会在进程退出时自动刷新缓冲区。底线是:如果希望缓冲输出立即可见,请使用std::flush或std::endl.Hum。。。但是那里的链接说程序退出了。不是这里的例子。你的程序终止了,还没有打印字符串吗?嗯,你问的方式似乎不可能解决。例如,函数aFunc是否清除I/O缓冲区?还有什么?我应该继续猜测吗?对不起,朋友。这正是我的问题:我想知道是什么导致了这一切??
cout << "Hello world";
toto();
// Gives me Hello world
// END
std::ostream::flush()