2010-01-22 66 views
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; 
} 

如果我省略了线using std::cout;using std::endl,编译器会时,我尝试使用coutendl抱怨。

但为什么这不需要srandrandtime?我很确定他们在std,因为如果我试图在他们面前特别倒入std::,我的代码工作正常。

回答

6

如果您使用cstdlib et al。它们中的名字被放置在全局名称和std ::名称空间中,所以你可以选择用std ::或前缀来替换它们。这被某些人视为一种特征,而被他人误认为是一种特征。

+4

\ *咳嗽\ * misfeature \ *咳嗽\ * – GManNickG 2010-01-22 09:39:43

3

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

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

+0

+1更智能的IDE ... – Inverse 2010-01-22 21:03:15

3

我宁愿忽略使用,只是有std :: cout每次只是为了保持可读性。虽然这可能只适用于较大的项目

+1

我第二个 - 我更喜欢在任何地方编写完整的命名空间(即使是小项目)。 – laura 2010-01-22 09:48:25

+1

如果有什么特别不愉快,并用很多然后typedef它更短的东西 – Patrick 2010-01-22 09:51:18

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; 
} 

那么,它没有直接关系,但我以为这可能是有用的。

+0

我不认为这是由标准保证'std :: vector :: iterator'是在std命名空间中。它可能在某个实现定义的名称空间中,或者它可能是一个原始指针。所以我意识到这只是一个例子,但我认为这不是一个好习惯。 – 2010-01-22 12:56:34

+0

@Steve Jessop - 我没有说这是件好事,这是我们应该注意的事情:-) – Serge 2010-01-22 14:03:52

+0

是否是koenig查找的结果。如果迭代器是指向int数组的指针,那么它会失败?这是另一个明确std ::的原因,因为你最终可能会从其他一些jokers命名空间中得到for_each()。 – 2010-01-22 16:18:23