我们可以使用下面代码段中的命名空间吗?代码在gcc和msvc中编译,让我对命名空间的使用感到困惑。
在f1.h:
namespace My { void foo(); }
在f1.cpp中 `
void My::foo() { }
我认为该函数应定义为:
namespace My { void foo() {} }
有人可以解释一下吗?
由于
答案 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的表现力的一个零点,但它仍然有助于获得干净的头文件。