Использует пространство имен .. вроде плохо?

Возможный дубликат:
Почему 'using namespace std;' считается плохой практикой в ​​C ++?

Каждый раз, когда я использую using namespace std, я всегда понимаю, что «это ужасная привычка программирования». Теперь я заканчиваю учебу в декабре этого года со степенью бакалавра наук. в C.S., но я не утверждаю, что знаю все, но никто никогда не объяснял, почему это так плохо. Я понимаю, что он делает, но, честно говоря, не вижу в этом особого смысла.

Кто-нибудь хочет объяснить? На мой взгляд, это просто делает набирать cout намного более терпимым, чем std::cout.

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


person Community    schedule 28.10.2010    source источник
comment
@meagar: в исходном посте был тег c, который сейчас удален. Так или иначе; Оставлю свой комментарий :-)   -  person pmg    schedule 28.10.2010
comment
Мы можем писать на машинном языке, если хотим кодировать, но мы пишем на языке высокого уровня, потому что нам нужно легко его понимать. То же самое с использованием std::cout my::cout и прочего. Это упрощает работу компилятора, а также для нас.   -  person Sayan Bhattacharjee    schedule 19.12.2015


Ответы (7)


нашел этот полезный пост в другом месте:

Пространства имен разделяют и организуют функциональность. У вас может быть функция xander333::sort(), и она не будет конфликтовать с std::sort(), boost::sort() или любым другим sort (). Без пространств имен может быть только один sort().

Теперь предположим, что вы поместили "using namespace std;" во всех ваших исходных файлах, и вы реализовали простую шаблонную функцию с именем fill() в глобальном пространстве имен одного из ваших файлов. Этот файл также зависит от заголовка из libFoo - foo.hpp. Версия 2.1 libFoo выходит, и внезапно ваша программа больше не компилируется. Ваша версия fill() вдруг конфликтует с другой fill()! Что случилось?

Оказывается, люди, реализующие libFoo, включены в новую версию foo.hpp, хотя раньше этого не делали. Теперь у вас есть все стандартные алгоритмы, включенные в ваш исходный файл, и ваш using namespace std; поместил их все в глобальное пространство имен. std::fill() теперь напрямую конфликтует с вашим fill().

Что еще более коварно, вы получили свой код для компиляции, переименовав свой fill() в xander333_fill(), но что-то не работает правильно - номера ваших отчетов отключены. Оказывается, ваша пользовательская функция divides(), которая выполняет математические вычисления с фиксированной точностью, больше не вызывается, потому что шаблонная функция из (также недавно включенная foo.hpp) обеспечивает лучшее соответствие, потому что вызываемые вами типы не совсем соответствуют объявленным типам .

Тема с соответствующим обсуждением находится здесь:

http://www.cplusplus.com/forum/unices/27805/

person Brandon Frohbieter    schedule 28.10.2010
comment
Или, проще говоря, в будущем легко получить конфликты имен, и их можно коварно исправить постфактум. - person Inverse; 28.10.2010

Нет проблем с использованием using namespace std в исходном файле, если вы интенсивно используете stl и точно знаете, что ничего не произойдет.

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

Знаете ли вы, что вы можете:

void somefunction()
{
  // Use it in a particular scope
  using namespace std;

  cout << "test" << endl;
}
person ereOn    schedule 28.10.2010
comment
Предостережение: вы не можете знать это наверняка. (Если вы никогда не меняете версии компилятора / библиотеки) - person sehe; 11.01.2016

«Хорошая практика», о которой я знаю, - это не помещать using namespace во включаемые файлы, но можно использовать его по своему вкусу в своих личных файлах .cpp. Я знаю людей, которым нравится, чтобы все было полностью квалифицировано, и некоторых (вроде меня), которые считают, что string - это std::string, если не указано иное.

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

Удачи!

person davka    schedule 28.10.2010

Я предпочитаю:

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

  2. всегда делайте такие вещи, как использование std :: cout; в верхней части файлов реализации, поэтому мне не нужно использовать std :: cout повсюду в моем коде.

person TofuBeer    schedule 28.10.2010

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

person Eric Mickelsen    schedule 28.10.2010

Другая причина не использовать using, кроме предотвращения потенциальных конфликтов именования, - это ускорить вашу IDE и, возможно, компилировать.

Если вы используете Visual Studio, using namespace std и / или using namespace boost могут полностью уничтожить intellisense. В этих пространствах имен есть много символов, которые вы можете не осознавать, и сброс их в глобальное пространство имен может быть нелепым.

person Inverse    schedule 28.10.2010

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

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

Если вы устали все время набирать std :: cout, вы можете использовать оператор using только для этого члена.

person WildCrustacean    schedule 28.10.2010