与仅在函数名称前添加前缀相比,使用命名空间为程序员提供了什么?
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 语句可用于使名称可用
没有 :: 范围运算符
理想情况下,命名空间应该
• 表达一组逻辑连贯的特征
• 阻止用户访问不相关的功能。
• 给用户带来最小的符号负担。
例如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 语句可用于使名称可用 没有 :: 范围运算符
理想情况下,命名空间应该
• 表达一组逻辑连贯的特征
• 阻止用户访问不相关的功能。
• 给用户带来最小的符号负担。