使用多个命名空间

Dav*_*own 2 c++ c++11

“我对 C++ 是全新的,对一般编码也相当陌生。我有一些关于命名空间的问题。

\n\n

命名空间到底是什么?是否可以在单个源文件中使用多个命名空间?

\n\n

我也很好奇在源文件的不同位置引入命名空间的结果。

\n\n

我知道可以在源文件的开头指定一个命名空间,即在包含输入输出流之后,

\n\n
using namespace std;\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者在函数内和代码行内,

\n\n
std::cout << \xe2\x80\xa6 << std::endl;\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这两个位置引入这两个命名空间有什么区别呢?

\n\n

是否有其他方法将命名空间引入源文件?

\n

Rom*_*men 6

命名空间到底是什么?是否可以在单个源文件中使用多个命名空间?

命名空间就像变量和函数名称的容器。当您有一个非常大的项目时,您可能会发现该项目的多个部分可能对某些内容使用相同的名称。

您可以在单个源文件中使用任意多个名称空间。

int aVariable;

namespace ModuleA
{
    int aVariable;
}

namespace ModuleB
{
    int aVariable;
}
Run Code Online (Sandbox Code Playgroud)

这些声明不会aVariable互相干扰,因为它们都位于不同的命名空间中。

我也很好奇在源文件的不同位置引入命名空间的结果。

使用特定命名空间有不同的方法...

// Somewhere in your code...
int var = aVariable;              // Uses the global aVariable
int varA = ModuleA::aVariable;    // Uses the ModuleA aVariable
int varB = ModuleB::aVariable;    // Uses the ModuleB aVariable
Run Code Online (Sandbox Code Playgroud)

您还可以使用using关键字将一个或多个变量或函数从命名空间导入到当前作用域中。

// Take everything from a namespace
using namespace ModuleA;
// Or take just one thing from a namespace
using ModuleB::aVariable;
Run Code Online (Sandbox Code Playgroud)

到目前为止我给出的例子有一个问题;aVariable在任何上下文中只能声明一次,因此当您同时拥有全局aVariable和使用时using namespace ModuleA;,您最终将aVariable在该上下文中声明该名称两次!这将显示为编译器错误。


还有一件重要的事情需要了解using namespace ...

如果在头文件中找到此行,则包含该头文件的任何其他文件也将接收来自该命名空间的导入名称。这可能会导致您的代码和其他人的代码之间出现意外的名称冲突。通常不赞成using namespace std;任何文件。

我建议您尽可能使用变量或函数的完全限定名称。所以使用std::min(a, b)而不只是min(a, b). 即使您using namespace std;的源代码中有 a ,该std::前缀仍然有效。最终,当您的项目变得足够大时,您可能需要删除该using namespace std;行,然后您就不必修复数百个std::函数的使用。