除了使用STL函数之外,我以前从未为我的代码使用过命名空间。
- 除了避免名称冲突之外,还有什么其他原因可以使用命名空间吗?
- 我必须在命名空间作用域内同时包含声明和定义吗?
除了使用STL函数之外,我以前从未为我的代码使用过命名空间。
这里有一个好理由(除了您提到的明显原因外)。
由于命名空间可以是不连续的,并且可以跨越翻译单元分布,它们也可以用于将接口与实现细节分开。
命名空间中名称的定义可以在同一命名空间中或任何封闭命名空间中提供(使用完全限定名称)。
它可以帮助你更好地理解。
例如:
std::func <- all function/class from C++ standard library
lib1::func <- all function/class from specific library
module1::func <-- all function/class for a module of your system
你也可以将其视为系统中的模块。
对于编写文档也很有用(例如:您可以轻松地在doxygen中记录命名空间实体)
难道名字冲突不足以作为一个理由吗?另外,ADL细节尤其是在操作符重载方面也需要考虑。
这是最简单的方法。您还可以在定义时使用命名空间前缀,例如 my_namespace::name。
auto foo = bar();
。这可能会使测试变得复杂,但您可以执行诸如void test1() { using ns1; TEST_EQ(x, y()); }
之类的操作 - 对于test2
/ns2
也是如此 - 并在一个可执行文件中运行两者。有时使用宏来生成具有不同using nsN;
的类似测试函数将简化事情,但编写长宏会变得丑陋。将测试(特别是函数体)移动到多次包含的支持文件中是另一种选择。(对于#ifdef
的代码,其中相同的符号或函数采用不同的定义,这种测试通常是不可能的)。 - Tony Delroy