Почему 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
имя, даже те, о которых вы не думали. Другими словами, он может создавать конфликты имен и неясности.
Проще говоря, вы с меньшей вероятностью ошибочно используете неправильные типы или функции или конфликты имен. Скажем, вы используете свою собственную математическую библиотеку, плюс 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 уровня исходного файла.