Использует пространство имен... как плохо?
Возможный дубликат:
Почему используется 'namespace std;' считается плохой практикой в С++?
Каждый раз, когда я использую using namespace std
, я всегда получаю "ужасную привычку программирования".
Теперь я заканчиваю в декабре этого года с моим B.S. в C.S., но я не утверждаю, что знаю все, но никто никогда не объяснял, почему это так плохо. Я понимаю, что он делает, но я, честно говоря, не вижу в этом большой возможности.
Кто-нибудь хочет объяснить? На мой взгляд, это просто делает типизацию cout
намного более терпимой, чем std::cout
.
Я могу понять, почему вы не хотите помещать его в заголовочный файл, но только в нормальном файле реализации... Я не понимаю, почему это будет проблемой.
Ответы
Ответ 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 только для этого члена.