使用命名空间为程序员提供的只是前缀函数名称有什么用?

时间:2015-03-22 07:02:11

标签: c++ c namespaces

E.g。 SFML::Render() vs SFML_Render()

我注意到在提供C和C ++绑定的库中,C ++版本通常使用命名空间(SFML,libtcod),C绑定执行相同的操作,但只是在名称前面加上它们所属的库。

它们都需要程序员为函数添加前缀,两者都给出了它们所属的上下文,它们都执行相同的功能。我真的很困惑命名空间提供的功能前缀有什么好处。

3 个答案:

答案 0 :(得分:4)

using - 声明

您可以编写using SFML::Render,之后您只需使用Render()调用该函数,而无需前面的SFML::using - 声明也可以作用于函数或类。对于带有前缀的名称,这是不可能的。

using - 指令

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

命名空间别名

如果您的符号具有较长的限定名称,例如mylib::sublib::foo::bar::x,您可以撰写namespace baz = mylib::sublib::foo::bar,然后仅x参考baz::x。这些也是范围特定的。

在C风格的前缀名称中,通常没有什么大的需要别名,如果有的话,你可以只使用一个宏。

添加到&从命名空间中删除

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

依赖于参数的查找

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

总而言之,命名空间更灵活并提供更多可能性,而不是前缀命名风格。

答案 1 :(得分:1)

使用SFML_Render很容易找到

fgrep -w SFML_Render,而如果SFML::Render命名空间是隐式的,则Render可能会在某些源文件中显示为SFML。 / p>

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

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

答案 2 :(得分:0)

他们认为它有很多名称空间用途。 其中一些:

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

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

和offcourse :可以使用using语句使名称可用 没有:: scope运算符

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

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

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

•对用户施加最小的符号负担。