C++ с использованием ключевого слова

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

using boost::shared_ptr;

а также

using namespace boost;

4 ответа

Решение
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, даже когда вы думаете, что вы с этим связаны.

  • using namespace boost делает все имена в boost пространство имен видимое без указания
  • using boost::shared_ptr просто делает shared_ptr видимый без квалификации.

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

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

Цитирование MSDN:

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

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

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

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

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