【问题标题】:namespace usage命名空间使用
【发布时间】:2010-01-22 09:27:50
【问题描述】:

我正在尝试以正确(或至少是最好的)方式开始使用命名空间。

我尝试做的第一件事是避免将using namespace xxx; 放在文件的开头。相反,我想尽可能在​​本地using xxx::yyy

这里有一个小程序来说明这一点:

#include <iostream>
#include <cstdlib>
#include <ctime>

int main() {
   using std::cout;
   using std::endl;

   srand(time(0));

   for(int i=0; i<10;++i)
      cout << rand() % 100 << endl;

   return 0;
}

如果我省略了using std::cout;using std::endl 行,当我尝试使用coutendl 时,编译器会报错。

但为什么 srandrandtime 不需要这样做?我很确定它们在std 中,因为如果我尝试专门将std:: 倒在它们前面,我的代码就可以正常工作。

【问题讨论】:

    标签: c++ namespaces std


    【解决方案1】:

    如果您使用 cstdlib 等。它们中的名称同时放置在全局和 std:: 命名空间中,因此您可以选择在它们前面加上 std:: 或不加上前缀。这被一些人视为一个特征,而被其他人视为一个错误特征。

    【讨论】:

    • *咳嗽* 错误特征*咳嗽*
    【解决方案2】:

    如果您真的想知道,请仔细查看 ctimecstdlib 标头。它们是向后兼容的。

    注意:usingusing namespace 的所有这些业务都是关于可读性的。如果您的 IDE 允许在您不想看到命名空间时不显示,那么您就不需要这些构造...

    【讨论】:

      【解决方案3】:

      为了保持可读性,我更喜欢每次都省略使用而只使用 std::cout。虽然这可能只在较大的项目中有用

      【讨论】:

      • 我支持这一点 - 我也更喜欢在任何地方编写完整的命名空间(即使是小型项目)。
      • 如果某些东西特别不愉快并且经常使用,那么将其键入更短的内容
      【解决方案4】:

      只要我们谈到这个主题,还有一个叫做 Koenig Lookup 的东西,如果它采用的参数来自同一个命名空间,它允许你在函数名之前省略命名空间标识符。

      例如

      #include <iostream>
      #include <algorithm>
      #include <vector>
      
      void f(int i){std::cout << i << " ";}
      int main(int argc, char** argv)
      {
         std::vector<int> t;
         // for_each is in the std namespace but there's no *std::* before *for_each*
         for_each(t.begin(), t.end(), f); 
         return 0;
      }
      

      好吧,它没有直接关系,但我认为它可能有用。

      【讨论】:

      • 我认为标准不能保证std::vector::iterator 在 std 命名空间中。它可能在某个实现定义的命名空间中,也可能是一个原始指针。所以我意识到这只是一个例子,但我认为这不是一个好习惯。
      • @Steve Jessop - 我没有说这是一件好事,这是我们应该注意的事情:-)
      • 这是 koenig 查找的结果。如果迭代器是指向 int 数组的指针,那么它会失败吗?这是明确 std:: 的另一个原因,因为您最终可能会从其他一些小丑命名空间中获得 for_each()。
      • 好吧,如果“其他小丑”编写了迭代器,理论上他们可能知道如何最好地为该迭代器实现for_each。只有 swap 通常通过 ADL 重载,以至于显式调用 std::swap 基本上是错误的(我的意思是,在一般对象上。您希望可以廉价复制的迭代器)。不过,有一些迭代器/算法组合在理论上可能会受益:我想到了为 std::set::iterator 实现 find,但由于某种原因,该标准没有出现。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      相关资源
      最近更新 更多