Что использование пространств имен предлагает программисту вместо префикса имени функции?

Например 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

В идеале пространства имен должны

• Выразить логически последовательный набор функций

• Запретить пользователю доступ к несвязанным функциям.

• Наложить минимальную нотационную нагрузку на пользователей.

Другие вопросы по тегам