C ++ с использованием ключевого слова - PullRequest
17 голосов
/ 07 августа 2011

В чем разница между этими двумя словами using:

using boost::shared_ptr;

и

using namespace boost;

Ответы [ 4 ]

35 голосов
/ 07 августа 2011
using boost::shared_ptr;

Включает только shared_ptr из пространства имен boost в текущем пространстве имен.Это означает, что вы можете использовать shared_ptr без указания его пространства имен boost.

Он называется с использованием объявления .


using namespace boost;

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

Он называется с использованием директивы .


Почему вы всегда предпочитаете using declaration над using directive?

Всегда лучше использовать первое (using declaration) и избегайте второго (using directive), поскольку второе вызывает загрязнение пространства имен , привнося потенциально огромное количество имен в текущее пространство имен, многие из которых не нужны.Наличие ненужных имен значительно увеличивает вероятность непреднамеренных конфликтов имен.

Цитировать Herb Sutter об использовании using directive:

Я считаю это полезнымдумать о using directive как о мародерствующей армии сумасшедших варваров, которая сеет неизбирательное разрушение, где бы он ни проходил - что-то, что одним лишь его присутствием может вызвать unintended conflicts,, даже если вы думаете, что вы с ним в союзе.

4 голосов
/ 07 августа 2011
  • using namespace boost делает все имена в пространстве имен boost видимыми без квалификации
  • using boost::shared_ptr просто делает shared_ptr видимыми без квалификации.
3 голосов
/ 07 августа 2011

Первый называется using declaration;

Второй называется using directive.

Цитата MSDN:

Обратите внимание на разницу между директивой using и объявлением using:

объявление using позволяет использовать отдельное имя без квалификации,

директива using разрешает все имена впространство имен, которое будет использоваться без квалификации.

1 голос
/ 07 августа 2011

Первый позволяет использовать только имя shared_ptr без префикса boost ::. Второй позволяет вам использовать любые имена в пространстве имен boost без префикса boost ::. Некоторые люди недовольны последним, но это никогда не доставляло мне проблем.

...