3

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

我尝试做的第一件事是避免放在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;
}

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

srand但是为什么,rand和不需要这个time?我很确定他们在 中std,因为如果我尝试专门倒std::在他们面前,我的代码工作正常。

4

4 回答 4

6

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

于 2010-01-22T09:37:30.423 回答
3

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

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

于 2010-01-22T09:33:16.410 回答
3

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

于 2010-01-22T09:34:34.307 回答
0

只要我们谈到这个主题,还有一个叫做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;
}

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

于 2010-01-22T09:46:07.067 回答