Что использование пространств имен предлагает программисту вместо префикса имени функции?
Например SFML::Render()
против SFML_Render()
Я заметил, что в библиотеках, которые предлагают привязки C и C++, часто версии C++ используют пространства имен (SFML, libtcod), а привязки C делают то же самое, но просто перед именем ставят то, к какой библиотеке они принадлежат.
Они оба требуют от программиста префикса функции, оба дают контекст относительно того, где они принадлежат, оба выполняют одну и ту же функцию. Я действительно смущен тем, какие преимущества предлагает пространство имен по сравнению с префиксом функции.
3 ответа
using
-declarations
Ты можешь написать using SFML::Render
после чего вы можете просто вызвать функцию с Render()
без необходимости SFML::
спереди. using
-declaration также может быть ограничен функцией или классом. Это невозможно с префиксными именами.
using
-directives
Вы также можете перенести все пространство имен в текущую область с помощью 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)
, Это может быть удобно, если вы придерживаетесь стиля, который предпочитает свободные методы пространства имен по сравнению с методами.
Итак, в заключение, пространства имен являются более гибкими и предлагают больше возможностей, чем префиксный стиль именования.
SFML_Render
легко найти с fgrep -w SFML_Render
, в то время как SFML::Render
может появиться в некоторых исходных файлах как просто Render
если SFML
пространство имен неявное.
Если вы программируете на C++, использование конструкций C++ дает существенные преимущества, но вам лучше использовать мощную среду, такую как Eclipse или Visual Studio, чтобы помочь вам разобраться во всех дополнительных сложностях.
Если вы хотите совместимости с C, вы не должны использовать пространства имен или перегрузки.
Они, как я вижу, есть несколько вариантов использования пространств имен. некоторые из них:
Изоляция имен: определите пакет (набор классов, функций, глобальных переменных, определений типов и т. Д.) В пространстве имен, чтобы гарантировать, что при включении эти имена не конфликтуют с существующим кодом.
Контроль версий: поддержка нескольких версий кода.
и offcourse: оператор using может использоваться для того, чтобы сделать имена доступными без оператора:: scope
В идеале пространства имен должны
• Выразить логически последовательный набор функций
• Запретить пользователю доступ к несвязанным функциям.
• Наложить минимальную нотационную нагрузку на пользователей.