В чем разница между этими двумя использованиями ключевого слова using
:
using boost::shared_ptr;
и
using namespace boost;
В чем разница между этими двумя использованиями ключевого слова using
:
using boost::shared_ptr;
и
using namespace boost;
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,
, даже когда вы думаете, reiedied with it.
using namespace boost
делает все имена в пространстве имен boost
видимыми без квалификацииusing boost::shared_ptr
просто делает shared_ptr
видимым без квалификации.Первый называется using declaration
;
Вторая называется using directive
.
Цитата MSDN:
Обратите внимание на разницу между директивой using и использованием Объявление:
использование объявления позволяет указать индивидуальное имя используется без квалификации,
директива using позволяет всем именам в пространстве имен, которое будет использоваться без квалификации.
Первый позволяет использовать имя shared_ptr без префикса boost::. Второй позволяет использовать любые и все имена в пространстве имен boost с префиксом boost::. Некоторые люди нахмурились, но это никогда не давало мне никаких проблем.