在c ++中使用命名空间

时间:2010-07-09 08:13:16

标签: c++ namespaces

我们可以使用下面代码段中的命名空间吗?代码在gcc和msvc中编译,让我对命名空间的使用感到困惑。

在f1.h:

namespace My
{
 void foo();
}

在f1.cpp中 `

void My::foo()
{
}

我认为该函数应定义为:

namespace My {
void foo() {}
}

有人可以解释一下吗?

由于

5 个答案:

答案 0 :(得分:8)

定义名称空间成员在其名称空间之外是合法的,只要它们的名称以其名称空间的名称为前缀,并且该定义实际上发生在包含它的名称空间中。它不能发生在嵌套在成员命名空间内的命名空间中。

namespace A { void f(); }
void A::f() { } // prefix with "A::"

namespace B { }
void B::f() { } // invalid! not declared in B!

namespace C { void f(); }
namespace D { void C::f() { } } // invalid! D doesn't enclose C

namespace E {
  void f();
  namespace F {
    void E::f() { } // invalid! F is nested inside E!
  }
}

与类成员相同,只要在名称前面加上类的名称,就可以在类成员之外定义函数。但是对于类,必须先在其各自的命名空间中声明命名空间成员,然后才能在其外部定义它们。

答案 1 :(得分:0)

是的,没关系。通过执行“My ::”,您表示您正在使用“我的”命名空间。

与将STL向量声明为“std :: vector< int>”的方式相同...

答案 2 :(得分:0)

两者都是真的

您可以全局或为每个函数设置名称空间

namespace My {
//in this are functions are in "My" namespace
}

namespace Your {
//in this are functions are in "Your" namespace
}

My::foo() {}
My::bar() {}
Your::foo() {}

如果你不想在每个函数的开头写“My ::”,你就把它写成第一个。第二个在有多个命名空间时非常有用

答案 3 :(得分:0)

它与执行相同:使用std命名空间;在顶部,只是做cout而不是做std :: cout。两者都有效,两者都有效,但你必须考虑如何使用它们。有利弊。

答案 4 :(得分:0)

我喜欢这是允许的:

namespace My
{
 void foo();
}

因为这意味着如果实用程序方法很长,它不会使头文件混乱。这样,更明显的是命名空间中提供了哪些方法。

我知道这可能是现代IDE的表现力的一个零点,但它仍然有助于获得干净的头文件。