Я думаю, что большинство программистов на C++ согласятся, что загрязнение глобального пространства имен - плохая идея, но бывают ли случаи, когда это правило можно игнорировать?
Например, у меня есть тип, который мне нужно использовать во всем конкретном приложении - я должен определить его таким образом:
mytypes.h
typedef int MY_TYPE;
foo.cpp
MY_TYPE myType;
Или используйте пространство имен:
mytypes.h
namespace ns {
typedef int MY_TYPE;
}
foo.cpp
ns::MY_TYPE myType;
...
using namespace ns;
MY_TYPE myType;
Какой ты предпочитаешь? Бывают ли случаи, когда допустимо использовать первый метод?





Я использую пространства имен для разделения кода библиотеки из кода конкретного приложения, а в большом проекте - для разделения различных модулей, составляющих проект.
Таким образом, глобальное пространство имен полезно для типов и функций, зависящих от приложения, которые используются в нескольких модулях в приложении.
Итак, если ваш MY_TYPE используется во всем вашем приложении, поместите его в глобальное пространство имен, в противном случае поместите его в именованное пространство имен.
Я вообще не согласен с использованием глобального пространства имен (ну, кроме main, конечно). Для вещей, которые используются во всем приложении, вы можете просто использовать using namespace в верхней части ваших файлов .cpp после всех соответствующих строк #include.
Не будем впадать в крайности: от того, чтобы вообще не использовать пространства имен, до отказа от глобального пространства имен ИМХО. Глобальное пространство имен и есть пространство имен. Что-то вроде CObject для классов MFC;) Тоже может пригодиться.
Полагаю, я пришел из школы мысли Java, которая гласит, что все должно быть в одном пакете (если, как я полагаю, вы не пишете тривиальное приложение). В Java классы в безымянном пакете имеют статус второго класса по сравнению с классами в именованном пакете.
Вы можете определить свой тип в отдельном пространстве имен и использовать
using ns::MY_TYPE;
Библиотеки не должны, Приложения могут.
Когда над приложением работают несколько человек, конечно, вам нужны четкие правила, и самое четкое правило - «не надо». Однако это не всегда идеально.
Операторы using должны размещаться только поверх файлов CPP, а не в заголовках, но это усложняет написание шаблонов, поскольку для большинства компиляторов в ближайшем будущем они должны находиться в заголовках.
По моему опыту (в основном небольшая команда с большим, но хорошо разделенным проектом), загрязнение пространства имен не является большой проблемой, если вы контролируете соответствующий код и настаиваете на описательных именах. Случаев, которые я помню, было немного, и с ними легко справиться. Однако были серьезные проблемы со сторонними библиотеками - даже с доступным исходным кодом.
YMMV с огромной командой или огромный проект, который входит в одну компиляцию.
Я в основном согласен, но если MY_TYPE используется во всем приложении, я считаю это возможным признаком того, что он может лучше работать как часть отдельного модуля / библиотеки.