名称空间用法

时间:2010-01-22 09:27:50

标签: c++ namespaces std

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

我尝试做的第一件事是避免将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::,我的代码工作正常。

4 个答案:

答案 0 :(得分:6)

如果你使用cstdlib等。它们中的名称放在global和std :: namespaces中,因此您可以选择使用std ::前缀。这被某些人视为特征,并被其他人视为错误。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分: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;
}

嗯,它没有直接相关,但我认为它可能有用。