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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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


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

Ответ 4

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

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

Ответ 5

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 a compilation error when no `using` is used in B
}

Ответ 6

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

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

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

Ответ 7

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

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

и т.д...

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

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

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

Ответ 8

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