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::. Некоторые люди недовольны последним, но это никогда не доставляло мне никаких проблем.