许多c++书籍包含这样的示例代码…

std::cout << "Test line" << std::endl;

...所以我也一直这么做。但我看到过很多开发者写的这样的代码:

std::cout << "Test line\n";

是否有技术上的原因,更喜欢其中一个,或者只是编码风格的问题?


当前回答

不是什么大问题,但是endl在boost::lambda中不起作用。

(cout<<_1<<endl)(3); //error

(cout<<_1<<"\n")(3); //OK , prints 3

其他回答

如果您同时使用Qt和endl,您可能会意外地使用不正确的endl,从而得到非常令人惊讶的结果。请看下面的代码片段:

#include <iostream>
#include <QtCore/QtCore> 
#include <QtGui/QtGui>

// notice that there is no "using namespace std;"
int main(int argc, char** argv)
{
    QApplication qapp(argc,argv);
    QMainWindow mw;
    mw.show();
    std::cout << "Finished Execution!" << endl;
    // This prints something similar to: "Finished Execution!67006AB4"
    return qapp.exec();
}

注意,我写了endl而不是std::endl(这将是正确的),显然有一个endl函数定义在qtextstream.h(这是QtCore的一部分)。

使用“\n”而不是endl完全避免了任何潜在的名称空间问题。 这也是一个很好的例子,说明为什么把符号放到全局命名空间(就像Qt默认做的那样)是一个坏主意。

不是什么大问题,但是endl在boost::lambda中不起作用。

(cout<<_1<<endl)(3); //error

(cout<<_1<<"\n")(3); //OK , prints 3

它们都将写入适当的行尾字符。除此之外,endl将导致缓冲区被提交。在执行文件I/O时,通常不希望使用endl,因为不必要的提交会影响性能。

可能存在性能问题,std::endl强制刷新输出流。

如果你要使用std::endl,这里隐含了另一个函数调用

a) std::cout << "Hello\n";
b) std::cout << "Hello" << std::endl;

A)呼叫操作员<<一次。 B)呼叫操作员<<两次。