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

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

  • автор:

Пространство имен (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# почти всегда пишут краткие имена классов, и только в случае конфликтов явно указывают пространство имён или используют алиасы. Язык немного отличается: там нет функций вне классов. Это позволяет меньше терять читаемость и реже натыкаться на неожиданные конфликты.

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

Стоит ли использовать «using namespace std»?
В разных источниках все по-разному относятся к этой строчке. Почему ее стоит или не стоит.

Что использовать, std::cout или просто using namespace std?
Приветствую! Сейчас учу С++, постигаю азы так сказать. В арсенале две книги — Джефф Кент, .

Использовать using namespace std; или каждый раз прописывать std:: . ?
Как безопаснее и рациональнее поступать? Как в больших проектах поступают на этот счет?

Почему using namespace std в разных местах?
Почему в одной программе начало такое #include <iostream> using namespace std; int main()

Стоит ли переходить на std:: или же лучше остаться на using namespace std?

Пишу на C++. Слышал что хорошие программисты используют std:: . Стоит ли тоже перейти и писать так же или же лучше оставаться на using namespace std и не вешать геморой на задницу?

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

5 комментариев

Простой 5 комментариев

longclaps

По правде, это именно то, без чего тебе никогда не стать хорошим программистом.
vladik_koresh @vladik_koresh Автор вопроса
longclaps, а можешь объяснить зачем его использовать, в чём плюсы? Ведь зачем то облегчили юзингом.

longclaps

vladik_koresh, ну что ты как маленький? Какой кодестайл в команде принят, в таком и пишут.
vladik_koresh @vladik_koresh Автор вопроса
longclaps, я не опытный программист, да и вообще ещё не программист толком)

myjcom

Roman @myjcom Куратор тега C++
Решения вопроса 0
Ответы на вопрос 2

mrjbom

А какие минусы в использовании using namespace std? По моему никаких, это только делает код более читабельным.

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Vitaly @vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)

Основная проблема — это возможные конфликты имён, в особенности, если вы прописываете использование нескольких пространств имён таким образом. Помимо этого, есть риск получить очень много вариантов различных конструкций в списке автодополнения IDE. Сам по себе std — это очень короткий идентификатор, поэтому опускать его нет особого смысла.

PS
Ко всему прочему, никогда не пишите «using namespace» в заголовочных файлах. За исключением случаев, когда вы действительно понимаете что делаете.

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

android

  • Android
  • +2 ещё

Почему FindLibrary выдает 0x0?

  • 1 подписчик
  • вчера
  • 56 просмотров

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

Этот последний код просто откажется компилироваться, именно потому что дважды объявлен класс MyClass . Здесь происходит обратный эффект: изначально внутри файлов глобальная территория была поделена на независимые территории, а внутри основной программы буквально говорят: давай мне все территории сразу, они мне все нужны. В итоге случается недоразумение, которое выше было описано. Жадность — начало местной беды.

Именно по этой причине использование формы using namespace std; так сильно прессуется опытными программистами. Ведь программист, который пишет другой код, не обязан знать обо всём, что написано в пространстве имён std или в файлах Петра и Васи. Теперь, полагаю, читателю легче понять, что существует большой риск повторения имён.

Даже вот в таком виде, проблема остаётся:
#include «FilePetr.h»
#include «FileWasa.h»
using Wasa : : MyClass ;
using Petr : : MyClass ; //Проблема осталась
Именно поэтому чаще всего всё сводится к узкой локализации в конкретном, в нужном месте:
#include «FilePetr.h»
#include «FileWasa.h»
Wasa : : MyClass x ; //Прямое описание
Petr : : MyClass y ; //Прямое описание
//Всё замечательно работает

Вот такая банальная причина нужна, чтобы протестовать против общеупотребимой новичками формы. Да, это быстро, удобно писать, код читабельней выглядит, но в то же время такая манера «жадного» написания кода даёт эффект описанной ошибки.

Если кода изначально написано много, а в нём использован «жадный способ» то при добавлении ещё одного файла к проекту дописывать для каждого места то, что изначально было опущено, может оказаться не самым приятным делом. Сам я не программист, поэтому не имел с этим практики, но последняя мысль моя вряд ли далека от истинны. Хотя, конечно, может я ошибся в таком выводе.

Речь немного о другом: чтобы избежать случайного включения какого-либо объявления, лучше использовать прямые описания.

Жадный способ — это способ, который употребим новичками: using namespace std; Жадным назван только мной, потому что буквально он и есть жадный: когда глобальная сущность поделена на кусочки, этот способ норовит взять всю глобальную сущность: «и для кого резали?» — спрашивается. Это несуществующий сейчас термин, моего авторства, не специалистов.

Но в подавляющем большинстве случаев лучше сразу привыкать к прямому описанию. На этом сайте в основном используется «жадная форма». Это для удобочитаемости, но не потому что это хорошо.

Ещё одна причина некоторой нелюбви к непрямому указанию пространства имени — это возможное перекрытие переменной.

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

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