Пространство имен (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 комментариев

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

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

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

А какие минусы в использовании using namespace std? По моему никаких, это только делает код более читабельным.
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Vitaly @vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Основная проблема — это возможные конфликты имён, в особенности, если вы прописываете использование нескольких пространств имён таким образом. Помимо этого, есть риск получить очень много вариантов различных конструкций в списке автодополнения IDE. Сам по себе std — это очень короткий идентификатор, поэтому опускать его нет особого смысла.
PS
Ко всему прочему, никогда не пишите «using namespace» в заголовочных файлах. За исключением случаев, когда вы действительно понимаете что делаете.
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- 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; Жадным назван только мной, потому что буквально он и есть жадный: когда глобальная сущность поделена на кусочки, этот способ норовит взять всю глобальную сущность: «и для кого резали?» — спрашивается. Это несуществующий сейчас термин, моего авторства, не специалистов.
Но в подавляющем большинстве случаев лучше сразу привыкать к прямому описанию. На этом сайте в основном используется «жадная форма». Это для удобочитаемости, но не потому что это хорошо.
Ещё одна причина некоторой нелюбви к непрямому указанию пространства имени — это возможное перекрытие переменной.