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

Они сказали мне в многочисленных случаях, что он состоит плохой практикой в том, чтобы использовать using namespace std; в наших программах. Следовательно, мы должны использовать std::cout и std::cin, что является самой подходящей формой.

Почему он using namespace std; считай плохим? Он действительно очень неэффективный, или риск заявления неясных переменных (переменные, которые имеют то же имя, что и функция в области имен std)? или преданный в результат значительно?

34
задан 10.03.2017, 13:18
1 ответ

Первоначальный автор

Грег Хюджилл https://stackoverflow.com / users / 893/greg-hewgill

Использование using namespaceне будь связан никакой формы с результатом. Однако считай следующую сцену: Ты используешь две так называемые библиотеки Foo и Bar и в данном моменте ты принимаешь решение импортировать области имен:

using namespace foo;
using namespace bar;

Все функционирует хорошо, ты можешь звонить Bla() Foo и в quux() Bar и без проблем.

Но в один день ты обновляешь в новую версию Foo 2.0 что предлагает так называемую функцию quux(). Результат у тебя есть конфликт: Так Foo 2.0 как Bar они имеют значение quux() в глобальной области имен. Исправлять ошибку может требовать достаточного усилия прежде всего, если параметры обоих функций равны.

Если вместо того, чтобы импортировать области имен, ты использовал foo::Bla() и bar::quux(), introduccir foo::quux() он не требует добавочных усилий.

Первоначальный автор

sbi https://stackoverflow.com / users / 140719/sbi

Я соглашаюсь со всем тем, что Грег написал, но мне хотелось бы добавлять деталь, которая могла бы быть хуже, чем прокомментированный Грегом:

Библиотека Foo 2.0 он мог бы вводить функцию, bar::quux() у которого была бы та же подпись, что и функция orignal книжного магазина Bar. То, за чем оно последует тогда, состоит в том, что код продолжил бы составлять, но молчаливой формы он мог бы переходить к тому, чтобы звонить в новую функцию, помещенную в Foo 2.0 вместо в функцию Bar и следствия, произошедшие от этого эффекта могут быть полностью непредсказуемыми.

Имей в виду, что область имен std у него есть тонны идентификаторов, много, которым они очень общие (думать в list, sort, string, iterator, и т.д.), и очень вероятно, что какой-либо из них заканчивает тем, что оказывается повторенным в другом книжном магазине.

Если кто-то думает, что это что-то, неправдоподобное достаточно не было бы больше комментирования, что уже есть по крайней мере вопрос в StackOverflow, где оно последовало за самим (так называемая функция не была ожидаемой благодаря тому, что был опущен префикс std) и ответ не появился даже один год спустя.

Первоначальный автор

ChrisW https://stackoverflow.com / users / 49942/chrisw

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

39
ответ дан 01.12.2019, 08:17