0

我正在查看glog的文档,并对流运算符的使用方式感到困惑。

LOG(INFO) << "Found " << num_cookies << " cookies";

它如何推断所有这些调用都是为了形成一条日志消息?

据我了解,这是:

cout << foo << bar << baz;

相当于:

cout << foo;
cout << bar;
cout << baz;

如果没有特殊的分隔符,它如何能够将这样的链接调用组合在一起?

编辑:

我知道您可以将它们链接起来,为什么有效,那不是我的问题。我在问 glog 能接受多少

LOG(INFO) << "Found " << num_cookies << " cookies";

在我看来,对<<重载进行 3 次单独调用并知道

"Found 3 cookies"

是单个日志消息,而不是 3。

4

1 回答 1

2

cout << foo返回cout

所以它变成了
cout << bar << baz;

等等。

另一种更清楚地看到它的方法是

((cout.operator<<(foo)).operator<<(bar)).operator<<(baz);

这正是正在发生的事情

您可以从http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/看到这一点

ostream& operator<< (double val);

编辑

在讨论之后,问题似乎更多地是关于 gLogs 如何在没有终止符或任何endl类型对象的情况下将每个日志分隔到自己的日志条目中。

从一瞥看来logging.h,每个单独的日志都可能由不同的流对象写入。

#define PLOG(severity) GOOGLE_PLOG(severity, 0).stream()

这意味着在使用相同的日志对象时,您会写入相同的日志条目。对 Log 的所有其他调用实际上都会创建一个新的流对象。RAII将负责实际写入完成的日志,因为这是一个临时对象,并且在执行代码行后被销毁

我需要更深入地了解代码才能更好地理解,但看起来这是一个准确的简短答案。问题仍然存在,如果(如果是的话)这是如何优化的..

于 2012-11-26T05:03:00.100 回答