Почему std:: используется опытными программистами, а не пространством имен std;?

Возможный дубликат:
Почему 'использование пространства имен std;' считается плохой практикой в ​​C++?

На днях, когда я задал вопрос, кто-то ответил, сказав, что если кто-то задает вопрос, покажите ему правильный способ сделать это, а не using namespace std; что я подумал немного странно, как using namespace std; Это намного проще, но я думаю, что сейчас я терплю неудачу, так как я начинающий программист, а вы, ребята, знаете лучше.

Итак, я думаю, мой вопрос: почему std:: вместо using namespace std;?

Благодарю.

6 ответов

Из C++ FAQ:

Должен ли я использовать using namespace std в моем коде?

Возможно нет.

Люди не любят печатать std:: снова и снова, и они обнаруживают, что using namespace std позволяет компилятору видеть любой std имя, даже если оно не квалифицировано Муха в этой мази в том, что она позволяет компилятору видеть любые std имя, даже те, о которых вы не думали. Другими словами, он может создавать конфликты имен и неясности.

https://isocpp.org/wiki/faq/coding-standards

Проще говоря, вы с меньшей вероятностью ошибочно используете неправильные типы или функции или конфликты имен. Скажем, вы используете свою собственную математическую библиотеку, плюс std, и объявите об их использовании в произвольном порядке. Теперь они оба определяют функцию pow. Какой Pow вы используете, когда вызываете Pow? Я думаю, что это стоит дополнительного набора текста.

Я не думаю, что это тот случай, когда более опытные программисты используют явные пространства имен, см., Например, вы предпочитаете явные пространства имен или "использование" в C++?

Однако обратите внимание, что вы никогда не должны импортировать пространства имен в заголовочных файлах и что в некоторых случаях явные пространства имен более понятны, например, с помощью функций std::min() а также std::max()

Я думаю, что это какая-то вещь предпочтения. Некоторым людям нравится видеть явные пространства имен при использовании классов. Единственным исключением является то, что я никогда не использую использование пространства имен std в заголовочном файле. Как это может неожиданно изменить поведение класса, который использует этот заголовочный файл.

Пространства имен являются дополнительными квалификаторами для наших переменных. Допустим, у нас есть определенная строка std и теперь, если мы определим "строку" в mynamespaceтакже.

Теперь, если я напишу using namespace std;вверху файла, затем оттуда строка становится неоднозначной для компилятора.

Можно, однако, принять средний подход, строго не имея using namespace std;в файле заголовка (.h), так как другие могут захотеть использовать ваш класс и могут получить конфликты. Что касается файла реализации (.cxx), вы можете использовать его осторожно, если уверены, что не будет никаких конфликтов.

Опытные программисты используют все, что решает их проблемы, и избегают всего, что создает новые проблемы.

Таким образом, они избегают использования директив уровня заголовка файла по очевидной причине.

И они стараются избегать полной квалификации имен внутри своих исходных файлов. Минус в том, что писать элегантный код не так уж и элегантно, когда без веского основания достаточно меньше кода. Основным моментом является отключение ADL.

Каковы эти веские причины? Иногда вы явно хотите отключить ADL. Когда-нибудь вы захотите устранить неоднозначность.

Итак, все в порядке: 1) директивы using на уровне функций и объявления using в реализациях функций; 2) объявления использования на уровне исходного файла внутри исходных файлов; 3) (иногда) директивы using уровня исходного файла.

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