【问题标题】:Why does cpplint discourage Streams?为什么 cpplint 不鼓励 Streams?
【发布时间】:2012-10-03 07:55:18
【问题描述】:

我只是在玩 cpplint,并尝试在我为好玩而编写的一些代码上运行它。我意识到以下行被标记为错误消息:-

#include <iostream>
...
#include <fstream>

yoohoo.cpp:3:  Streams are highly discouraged.  [readability/streams] [3]
yoohoo.cpp:5:  Streams are highly discouraged.  [readability/streams] [3]

我很好奇为什么不鼓励使用流。

【问题讨论】:

    标签: c++ stl coding-style cpplint


    【解决方案1】:

    流可能导致问题的主要原因是国际化。

    每当您需要以几种不同的语言生成具有动态内容的文本时,事情就会出错,因为每种语言都有自己的语法规则。例如,在英语中你会使用:

    void print(std::ostream& out, int i) {
        out << "You retrieved ";
        switch(i) {
        case 0: out << "no file."; return;
        case 1: out << "1 file."; return;
        default: out << i << " files." return;
    }
    

    那很好,对吧?

    因此,当您翻译成法语时,您只需决定将所有这 4 个句子部分移动到一个表格中,您将在其中按键查找它们,它就可以了!

    然后您会发现Polish,从gettext 文档中,这里是file (plik) 的复数形式:

    1 => 点

    2,3,4 => 折叠

    5-21 => pliko'w

    22-24 => 折叠

    25-31 => pliko'w

    嗯……突然事情变得困难了,对吧?

    实际上,情况可能会变得更糟。并非所有语言都需要以相同的顺序放置您的动态条目!

    这就是为什么流实际上不能用于国际化文本,除非为每个要显示的文本编写一个可重载的 C++ 函数,并让翻译器提供重载!哼……

    两者各有利弊,谷歌风格指南非常固执己见,尽可能确保一致性。

    【讨论】:

      【解决方案2】:

      这是根据 google c++ 编码指南检查 c++ 的吗? 如果是这样,那么原因是 google 的 c++ 指南通常被认为有些古怪,并不真正适用于许多人认为现代 c++ 的良好实践。

      【讨论】:

      • 这是他们的推理:google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Streams 当然,如果您不想遵循他们的指导方针,则无需遵循。
      • 禁止字符串流是愚蠢的。你想用什么? snprintf 非常受限,asprintf 可能无法使用...
      • google 的讨论没有提到流的两个重要优点。流可以扩展到新类型。您不能让 printf 接受新的格式说明符。流接口也独立于目的地。使用 printf,您必须使用 sprintf、fprintf 等,这使得编写与目标无关的代码变得困难。就是说我仍然经常使用 printf 。我认为没有必要强制其中之一。
      猜你喜欢
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 2019-12-19
      • 2018-11-26
      • 2016-05-24
      • 2018-03-04
      相关资源
      最近更新 更多