Вы предпочитаете явные пространства имен или "использование" в C++?

При использовании пространств имен C++ вы предпочитаете явно называть их, например, так:

std::cout << "Hello, world!\n";

Или ты предпочитаешь using namespace:

using namespace std;
cout << "Hello, world!\n";

И если вы предпочитаете последнее, объявляете ли вы ваши использования в области файлов или функций?

Лично я предпочитаю явно называть их - это больше печатать, но при использовании смеси пространств имен (например, std а также boostЯ нахожу это более читабельным.

8 ответов

Решение

Я всегда использую using namespace для STD & Boost. Ко всему прочему я склонен использовать явное пространство имен, если оно не используется настолько сильно, что это может загромождать код.

В заголовках я никогда не использую using namespace чтобы не загрязнять глобальное пространство имен источника #inclusive.

Я использую всегда явные. Написание std меня не ранит, и я четко вижу, откуда оно. Это полезно, когда у вас есть какой-то унаследованный проект, который нужно поддерживать со своими собственными "строками", "векторами" и т. Д. Чем больше информации несет код, тем лучше.

Дополнительный набор не проблема здесь. Проблема с явно заданными именами заключается в визуальном беспорядке. Посмотрим правде в глаза, синтаксис C++ неопрятен. Нет необходимости усугублять это, бесполезно делая имена длиннее и щедро посыпая код ::s.

Я с Джеффом Этвудом: лучший код - это вообще не код. Это так верно.

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

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


1) Следствие: нет using в заголовках!

using а также using namespace Очень и очень полезно сделать код более читабельным - удалите беспорядок.

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

Я пытаюсь ограничить объем импортируемых пространств имен:

void bar() {

   // do stuff without vector

   { using std::vector;
      // do stuff with vector
   }

   // do stuff without vector
}

Для "общеизвестных" библиотек, таких как stdЯ бы осмелился использовать using namespace std, Есть основания полагать, что каждый, кто читает этот код, знает эти символы.

В качестве обозначения, using Ключевое слово также используется, чтобы указать, что производный класс также экспортирует перегруженные члены своего суперкласса.

class A {
  void f( A  );
  void f( bool );
};

class B : public A {
  using A::f; // without this, we get a compilation error in foo()
  void f(bool);
};

void foo() {
  B b;
  b.f( A() ); // here's a compilation error when no `using` is used in B
}

Мое общее правило - всегда явно использовать пространство имен в заголовках и обычно использовать использование в коде. Причина первого заключается в том, чтобы четко указать в каждой части определения, что используется, а причина второго состоит в том, что он позволяет легко использовать замены из другого пространства имен, если это становится необходимым. то есть, если мы хотим начать использовать foo:: string вместо std:: string, нам просто нужно обновить заголовок и инструкцию using, а не заменять каждый экземпляр std:: string на foo:: string в коде.

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

using в области действия функции, или если функция очень мала (часто есть), просто явное пространство имен

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

Единственное другое время, когда я прописываю пространство имен, это когда я использую его только один или два раза, например, добавление в оператор быстрой отладки или если я использую какую-то нестандартную библиотеку.

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

Я склонен явно импортировать имена, которые мне нужны, вверху файла.cpp, так что...

используя std::cout; используя std::endl;

так далее...

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

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

Я всегда использую полностью определенные имена в заголовках и почти никогда не использую "использование пространства имен x" где-либо...

Другие вопросы по тегам