2008-10-18 3 views
16

При использовании пространств имен C++, вы предпочитаете, чтобы явно назвать их, как это:Вы предпочитаете явные пространства имен или «использование» в C++?

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

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

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

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

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

ответ

17

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

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

2

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

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

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

19

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

+1

Это не больно, пока не будет шаблон специализации, что вы пропустите, потому что вы указали пространство имен явно , Я должен признать, что я делаю то же самое из habbit, но это то, о чем я думаю более разумно, так как читал «Эффективный C++» Майера. – paxos1977 2008-10-18 14:30:50

+0

Thats только когда-либо действительно была проблемой для min и max для меня на практике, еще более увязана с заголовком MS, также делая #define min и max – paulm 2014-09-05 19:28:16

4

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

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

19

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

Я с Джеффом Этвудом: The Best Code is No Code At All. Это так.

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

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


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

1

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

4

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

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

Я пытаюсь limiit сферы импортируемых пространств имен:

void bar() { 

    // do stuff without vector 

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

    // do stuff without vector 
} 

Для «общеизвестной» библиотеки, как std, осмелюсь использование using namespace 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 
} 
2

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

использование зОго :: COUT; использование std :: endl;

и т.д ...

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

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

Я всегда использовать полные имена в заголовках и вряд ли когда-либо использовать «с использованием пространства имен х» где-нибудь ...

Смежные вопросы