与仅在函数名称前添加前缀相比,使用命名空间为程序员提供了什么?

What does using namespaces offer the programmer over just prefixing the function name?

例如SFML::Render() 对比 SFML_Render()

我注意到在提供 C 和 C++ 绑定的库中,C++ 版本通常使用名称空间(SFML、libtcod),而 C 绑定做同样的事情,只是在名称前加上它们所属的库的前缀到.

它们都需要程序员在函数前加上前缀,都给出了它们所属位置的上下文,它们都执行相同的功能。我真的很困惑名称空间相对于函数前缀有什么好处。

using-声明

你可以写using SFML::Render,然后你可以简单地用Render()调用函数,而不需要前面的SFML::using 声明也可以限定为函数或 class。这对于前缀名称是不可能的。

using-指令

您还可以使用 using namespace 将整个命名空间引入当前范围。每个人都知道 using namespace std 的作用。这些也可以限定范围。

命名空间别名

如果您有一个带有长限定名称的符号,例如mylib::sublib::foo::bar::x,你可以写namespace baz = mylib::sublib::foo::bar,然后用baz::x引用x。这些也是特定范围的。

在 C 风格的前缀名称中,通常没有那么大的东西需要别名,如果有,您可以使用宏。

在命名空间中添加和删除

如果您有一个充满函数的文件需要放置在命名空间 x 下,您只需添加两行即可实现:namespace x {}。从名称空间中删除同样简单。使用前缀名称,您必须手动重命名每个函数。

参数相关查找

如果函数与其某些参数位于同一命名空间中,则您可以在函数调用中省略命名空间限定。例如,如果命名空间 baz 包含一个枚举 E 和一个接受它的函数 F,您可以写成 F(baz::E) 而不是 baz::F(baz::E)。如果您 follow the style 更喜欢命名空间的自由函数而不是方法,这会很方便。

总而言之,与前缀命名风格相比,命名空间更灵活并提供更多可能性

SFML_Render 很容易用 fgrep -w SFML_Render 找到,而 SFML::Render 在某些源文件中可能只显示为 Render 如果 SFML 命名空间是隐式的.

如果您使用 C++ 编程,那么使用 C++ 结构有很大的好处,但您最好使用强大的环境,例如 Eclipse 或 Visual Studio 来帮助您理解所有增加的复杂性。

如果您想与 C 互操作,则不应使用命名空间或重载。

按照我的看法,名称空间有多种用途。 其中一些:

名称隔离:定义一个包(一组类,函数, 全局变量、类型定义等)在命名空间中以确保当 包括在内,这些名称不会与现有代码冲突。

版本控制:维护代码的多个版本。

and offcourse : using 语句可用于使名称可用 没有 :: 范围运算符

理想情况下,命名空间应该

• 表达一组逻辑连贯的特征

• 阻止用户访问不相关的功能。

• 给用户带来最小的符号负担。