Вы предпочитаете явные пространства имен или «использование» в C ++? - PullRequest
16 голосов
/ 18 октября 2008

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

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

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

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

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

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

Ответы [ 8 ]

20 голосов
/ 18 октября 2008

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

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

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

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


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

19 голосов
/ 18 октября 2008

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

17 голосов
/ 18 октября 2008

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

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

4 голосов
/ 18 октября 2008

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
}
4 голосов
/ 18 октября 2008

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

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

2 голосов
/ 18 октября 2008

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

с использованием std :: cout; используя std :: endl;

и т.д ...

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

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

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

2 голосов
/ 18 октября 2008

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

2 голосов
/ 18 октября 2008

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

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

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

...