Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Пространства имен разделяют и организуют функциональность. У вас может быть функция 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/

Ответ 2

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

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

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

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

  cout << "test" << endl;
}

Ответ 3

"хорошая практика", о которой я знаю, заключается не в том, чтобы вставлять using namespace в файлы include, но быть свободным использовать ее по своему вкусу в ваших личных .cpp файлах. Я знаю людей, которые любят все, чтобы быть полностью квалифицированными, а некоторые (как я), которые считают, что string является std::string, если не указано иное.

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

Удачи!

Ответ 4

Мое предпочтение заключается в следующем:

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

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

Ответ 5

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

Ответ 6

Еще одна причина не использовать using, кроме как избежать потенциальных конфликтов имен, заключается в ускорении вашей IDE и, возможно, компиляции.

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

Ответ 7

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

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

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