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

StackOverflow https://stackoverflow.com/questions/214927

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

<Ч>

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

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

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

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

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

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

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

void bar() {

   // do stuff without vector

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

   // do stuff without vector
}

Для "общеизвестного" библиотеки, такие как std , я бы осмелился использовать используя пространство имен 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
}

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

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

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

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

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

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

и т.д...

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top