Почему не стоит использовать using namespace std
Перейти к содержимому

Почему не стоит использовать using namespace std

Почему использование пространства имен std считается плохой практикой?

Здравствуйте! Почему использование пространства имен std (using namespace std) считается плохой практикой? Язык плюсы изучаю сам, та и тем более мне этот язык сильно нравиться.Смотрел лекции на ютубе которые вел Тимофей Харьянов — именно он говорил что использование using namespace std это очень плохо, даже Бьёрн Страуструп не рекомендует..Пошел гуглить как ответа и не понял..

  • Вопрос задан более трёх лет назад
  • 706 просмотров

Комментировать

Решения вопроса 1

Adamos

Например, потому, что в пространстве std хренова туча объявленных в библиотеке функций, про которые вы, возможно, даже не подозреваете. И можете назвать свою собственную функцию так же. Даже не подозревая, что при каждом ее вызове компилятор теперь сомневается, которую использовать — вашу или библиотечную. И решение в пользу библиотечной (например, потому, что вы ошиблись в аргументах) окажется для вас сюрпризом.

Ответ написан более трёх лет назад

Нравится 6 4 комментария

Почему using namespace std — плохо?

Используя пространства имен, мы можем явно указать, из какого пространства имен мы хотим использовать определенный символ. Например, в коде std::cout , std является пространством имен, а cout — символом из этого пространства имен, представляющим стандартный поток вывода. Использование ключевого слова using namespace std позволяет нам обращаться к символам из пространства имен std без явного указания этого пространства имен каждый раз. Однако, это также может привести к проблемам. Например, если мы имеем два различных пространства имен, каждое со своим символом info , и мы используем using namespace для обоих пространств имен, то возникает конфликт имён. Компилятор не знает, из какого пространства имен мы хотим использовать info , и может возникнуть неоднозначность. Чтобы избежать таких проблем, хорошей практикой является указывать пространство имен перед каждым символом или использовать только необходимые символы из пространства имен с помощью оператора разрешения области видимости :: . Также стоит избегать использования using namespace в глобальной области видимости в заголовочных файлах, чтобы не добавлять символы из пространства имен в глобальную область видимости всего проекта.

Более простым языком я рассказал об этом в своем телеграм канале: https://t.me/Aren_et_adventures/12

Категории

Счётчик посещений

Теги

© Арен Елчинян 2022-2023 Powered byBludit

Пространство имен (using namespace std;)

Очень часто в интернете вижу как многие программисты усердно пишут везде программы используя в коде std:: . Зачем они это делают? Почему нельзя просто использовать using namespace std; перед программой, так же удобнее и код начинает «дышать». Или это плохой тон и стоит переучиваться на использование std:: непосредственно в коде программы?

Отслеживать
30.9k 13 13 золотых знаков 96 96 серебряных знаков 157 157 бронзовых знаков
задан 11 апр 2015 в 14:23
347 1 1 золотой знак 3 3 серебряных знака 6 6 бронзовых знаков

Добро пожаловать в мир крестов. Я не знаю как ответить на этот вопрос. По поводу дышашего кода из за одного using объявления вы преувеличиваете.

11 апр 2015 в 14:24

Так почему же преувеличиваю? Грубо говоря что я потратил всего одну строчку для using namespace std; и что у меня во всём коде можно сказать на каждой строчке красуется std. По факту очень даже ощутимая разница если визуально оценивать код. Может это конечно глупости и не стоит по поводу этого заморачиваться. Но пока что, этот момент мне не понятен)

11 апр 2015 в 14:28

Вы понимаете что в C например вообще нет пространств имен? А в С++11 директива using может быть использована например для создания шаблонных синонимов или вместо typedef для создания синонима типа. Короче я не знаю как ответить на вопрос почему какие-то люди где-то там далеко вместо using namepace std; пишут std::cout . Может им так нравится или они просто дураки? Откуда мне знать точную причину?

11 апр 2015 в 14:40
Вот ещё по теме: ru.stackoverflow.com/q/201310/10105
11 апр 2015 в 16:03
А что такое «дышащий код»?
26 апр 2015 в 6:31

5 ответов 5

Сортировка: Сброс на вариант по умолчанию

Зависит от традиций. Среди плюсовиков традиция «лучше перестраховаться, чем получить внезапные трудно отлаживаемые проблемы неизвестно где».

Явное указание пространства имён — это избавление от потенциальных проблем в будущем. Положим, вы подключили через using namespace два пространства имён. Всё замечательно, кратко, красиво.

А потом вышла новая версия одной из библиотек, и какие-то идентификаторы стали резолвиться по-другому, например, во второй библиотеке добавили функцию, которая к вашим аргументам подходит лучше, чем используемая вами ранее функция из первой библиотеки.

В лучшем случае ваш код не соберётся. Может упасть. А может так получиться, что ваш код перестанет работать у клиента в 1% случаев. Всё может быть.

Отлавливать и исправлять подобные проблемы мучительно больно.

Насколько это важно конкретно для вас — решать вам. Если у вас простой проектик и от силы пара сторонних библиотек (или вообще только стандартная библиотека), то можно не заморачиваться с явным указанием пространств имён. Если проект огромный, с десятками библиотек, то может оказаться более удобным (и наглядным) всегда указывать пространства имён.

Банальный пример: положим, вы пользуетесь только стандартной библиотекой и boost, поэтому решили везде писать:

using namespace std; using namespace boost; 

. а теперь выходит новая версия стандартной библиотеки, в которой из boost перетащено много классов. И внезапно ваш код больше не компилируется.

В других языках другие традиции. Например, в C# почти всегда пишут краткие имена классов, и только в случае конфликтов явно указывают пространство имён или используют алиасы. Язык немного отличается: там нет функций вне классов. Это позволяет меньше терять читаемость и реже натыкаться на неожиданные конфликты.

Библиотеки, пространства имён (namespace) в С++: 8-я часть гайда по языку программирования

Разбираемся, как ускорить работу с кодом в несколько раз, используя готовые решения.

Евгений Кучерявый

Евгений Кучерявый

Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.

Это восьмая часть из серии статей «Глубокое погружение в C++». В прошлой статье мы узнали, как хранить данные в массивах. Сегодня — ещё интереснее.

Недавно мы говорили о том, что многие функции уже написаны другими разработчиками и помещены в специальные библиотеки. Если такая библиотека входит в состав языка или находится в открытом доступе, то вы можете использовать все её возможности.

Это очень удобно, и многие специально пишут универсальные библиотеки, которые пригодятся в самых разных проектах. Давайте разберёмся с библиотеками подробнее и научимся создавать свои.

Пространства имён в C++

Пространство имён (англ. namespace) — это группа взаимосвязанных функций, переменных, констант, классов, объектов и других компонентов программы.

С самого начала изучения C++ мы используем команду std: cout, чтобы выводить данные в терминал. На самом деле команда называется просто cout, а std — это пространство имён, в котором она находится.

Пространства имён нужны, чтобы логически связывать части программы. Например, математические функции, физические, бухгалтерские и так далее.

Вот пример создания пространства имён:

Обратите внимание, что функция pow, как и другие математические функции, существует также и в библиотеке cmath.

Заключение

Библиотеки и пространства имён — это полезные инструменты для каждого разработчика. В интернете есть готовые решения для любых задач, поэтому многие работодатели ищут специалистов, которые разбираются в определённой библиотеке.

Если вы часто работаете над однотипными проектами, можете написать для себя библиотеку и подключать её во все проекты, чтобы ускорить работу. Однако новичкам стоит стараться писать код каждый раз заново — так вы сможете его постоянно переосмысливать и замечать то, чего раньше не замечали.

Читайте также:

  • Что нужно знать разработчику C++ и какие есть перспективы в карьере
  • Apache, Mozilla, Sun и Eclipse: свободные лицензии компаний и некоммерческих организаций
  • 5 советов сеньорам: автоматизация, отмазки, потери времени, слово пацана и образование

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *