E.g。 SFML::Render()
vs SFML_Render()
我注意到在提供C和C ++绑定的库中,C ++版本通常使用命名空间(SFML,libtcod),C绑定执行相同的操作,但只是在名称前面加上它们所属的库。
它们都需要程序员为函数添加前缀,两者都给出了它们所属的上下文,它们都执行相同的功能。我真的很困惑命名空间提供的功能前缀有什么好处。
答案 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运算符
理想情况下,名称空间应该
•表达一组逻辑连贯的特征
•阻止用户访问不相关的功能。
•对用户施加最小的符号负担。