我正在尝试以正确的(或至少是最好的)方式使用命名空间。
我尝试做的第一件事是避免将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
,编译器会在我尝试使用cout
或endl
时抱怨。
但为什么srand
,rand
和time
不需要这样做?我很确定他们在std
,因为如果我尝试在他们面前专门倾注std::
,我的代码工作正常。
答案 0 :(得分:6)
如果你使用cstdlib等。它们中的名称放在global和std :: namespaces中,因此您可以选择使用std ::前缀。这被某些人视为特征,并被其他人视为错误。
答案 1 :(得分:3)
如果您真的想知道,请仔细查看ctime
和cstdlib
标题。它们是向后兼容的。
注意:所有这些using
与using 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;
}
嗯,它没有直接相关,但我认为它可能有用。