【发布时间】:2011-03-13 18:15:36
【问题描述】:
我们可以像下面的 sn-p 那样使用命名空间吗?代码在 gcc 和 msvc 中编译,让我对命名空间的使用感到困惑。
在 f1.h 中:
在 f1.cpp 中 `
无效我的::foo() { }
我认为函数应该定义为:
命名空间我的{ 无效 foo() {} }谁能解释一下?
谢谢
【问题讨论】:
标签: c++ namespaces
我们可以像下面的 sn-p 那样使用命名空间吗?代码在 gcc 和 msvc 中编译,让我对命名空间的使用感到困惑。
在 f1.h 中:
在 f1.cpp 中 `
无效我的::foo() { }
我认为函数应该定义为:
命名空间我的{ 无效 foo() {} }谁能解释一下?
谢谢
【问题讨论】:
标签: c++ namespaces
和做的一样:using std namespace;在顶部,只是做 cout 而不是做 std::cout。两者都可以工作并且都是有效的,但你必须考虑如何使用它们。有利有弊。
【讨论】:
我喜欢这是允许的:
namespace My
{
void foo();
}
因为这意味着如果实用程序方法很长,它不会弄乱头文件。这样命名空间中提供了哪些方法就更明显了。
我知道这对于现代 IDE 的表现力来说可能是一个零点,但它仍然有助于拥有干净的头文件。
【讨论】:
在其命名空间之外定义命名空间成员是合法的,只要它们的名称以其命名空间的名称为前缀,并且定义实际上发生在包含它的命名空间中。它不会发生在嵌套在成员命名空间内的命名空间中。
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!
}
}
这与类成员相同,您也可以在其类之外定义函数,只要在名称前加上类名即可。然而,对于类,命名空间成员必须首先在它们各自的命名空间中声明,然后才能在其外部定义。
【讨论】:
A::f 或namespace A { f } 定义独立函数。至少 Boost 似乎更喜欢后者。
两个都是真的
您可以全局设置命名空间或为每个函数设置命名空间
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::”,你把它写成第一个。第二个在有多个命名空间时很有用
【讨论】:
是的,没关系。通过执行“My::”,您表明您正在使用“My”命名空间。
与将 STL 向量声明为 "std::vector" 的方式相同 ...
【讨论】: