Точный Дубликат: Вы предпочитаете явные пространства имен или 'использующий' в C++?
Какой из них является предпочтительной конвенцией для использования какого-либо пространства имен?
using namespace std;
или
using std::cin; using std::cout;
или
вызывание функции как и при необходимости в коде?
std::cout<<"Hello World!"<
Здесь дается очень хорошее объяснение.
Первый стиль, т.е. использование пространства имён, что бы то ни было, наносит ущерб всей цели пространства имён. Вы никогда не должны использовать его, кроме как в маленьких фрагментах кода. (Там я его тоже не использую! :D )
Второй слишком многословен. Не практично.
Лично мне нравится третий стиль, т.е. ввод полного квалифицированного имени (например, std::cout).
Помните, что код читается гораздо больше раз, чем написано, а использование полного квалифицированного имени IMO делает ваш код более читабельным.
.Это модифицированная версия другого ответа, который я написал на ту же тему. Хватит этих вопросов, и, возможно, я закончу окончательным сообщением ;)
Основная проблема - конфликты имен, в том, что если у вас в коде есть переменная с именем cout и вы используете пространство имён std;
, то это будет двусмысленно в отношении того, что вы имеете в виду. Это не просто cout
. count
, reverse
и equal
также будут включены, которые являются общими идентификаторами.
Не обращая внимания на все проблемы компилятора, это также проблема для любого, кто придет читать ваш код. Эти дополнительные 5 символов гарантируют, что следующий человек, поддерживающий ваш код, точно знает, что вы имеете в виду.
Стоит также отметить, что вы никогда не должны помещать
using namespace std;
в заголовочный файл, так как он может распространяться на все файлы, которые включают этот заголовочный файл, даже если они не хотят использовать это пространство имён. Другая проблема заключается в том, что также не ясно, что пространство имён std было импортировано, поэтому сопровождающий (или вы через 3 месяца) добавляет переменную с тем же именем, что и какая-то непонятная функция std, которая была включена в тот же модуль компиляции, а затем тратит час, пытаясь найти причину ошибки компиляции.
В большинстве случаев очень полезно использовать такие вещи, как
using std::swap
Как будто существует специализированная версия swap, компилятор будет использовать ее, в противном случае он вернется к std::swap
. Если вы вызываете std::swap
, вы всегда используете базовую версию, которая не будет вызывать специализированную версию (даже если она существует).
Возьмем, к примеру, код, использующий идиому пимплана pimpl. Где в качестве копии по умолчанию можно скопировать все данные в реальной реализации, где, как и все, нужно поменять указатели. Использование специализированного свопа может сэкономить огромное количество времени исполнения, а хорошо спроектированные библиотеки должны его специализировать. В общем,
Всегда предпочитайте использование std::swap
вместо std::swap()
Избегайте использования пространства имен std
в заголовке любой ценой из-за распространения, старайтесь не использовать его в файлах реализации.
Иметь тысячи используя std::foo
в верхней части каждого файла - это не лучший путь. В лучшем случае используйте его для классов общего пользования.
Все остальное - это мнение.
. Я всегда перечисляю полное пространство имён. Оно улучшает читабельность и позволяет другим людям знать, откуда исходят ваши функции и данные. использование
очень раздражает при чтении кода других людей, особенно когда я пытаюсь что-то узнать, потому что я не могу сказать, является ли это частью того или иного пространства имён. И, как говорят эти другие здравомыслящие люди, это все-таки побеждает всю суть пространства имён, не так ли? Смысл в том, чтобы держать все отдельно и наполнять смыслом данные и логику.
Хороший порядок, чтобы помнить: самый важный человек - это клиент, который использует программу; второй по важности - это другие программисты, которые либо поддерживают, либо пытаются учиться на вашем коде; наименьший по важности - это вы. :-)
.Лично я предпочитаю третий вариант. Просто взгляните на это:
namespace A { int a=0; }
namespace B { int a=0; }
и вы используете его как..:
using namespace A;
using namespace B;
using namespace std;
cout<<a<<endl; //error here!
Вместо этого, если бы Вы могли просто сказать,
std::cout<<B::a<<std::endl; //No problem, more readable
Хотя для набора кода может потребоваться немного больше времени, вторая и третья опции являются более (вроде) предпочтительными.
Об этом уже много раз спрашивали, но, похоже, мои поиски SO покинули меня на данный момент. В основном:
Никогда не помещайте директивы use любого рода в заголовочный файл - это загрязнит ваш код и введет всевозможные сложности с отслеживанием ошибок.
Предпочитаю использовать декларацию типа с помощью std::string
в реализации (. cpp) файла, который интенсивно использует такой тип.
В крайнем случае, используйте , используя пространство имён std
, но только в реализационных файлах - для удобства я использую его в сообщениях компилируемого кода на SO.
Это вопрос стиля, но с одной стороны: никогда не импортируйте пространство имён в глобальный диапазон. Например:
#include <iostream>
using namespace std; // Pollution!
int main()
{
....
}
Если вы хотите импортировать пространство имён, просто импортируйте его в тот диапазон, в котором вы работаете:
#include <iostream>
int main()
{
using namespace std; // Good!
....
}
Я просто хотел бы отметить, что , используя пространство имён foo
, обнаружено. Пример:
#include <iostream>
#include <vector>
//...
for (int i=0; i<10; ++i)
{
using namespace std;
cout << i << endl;
}
vector v; // won't compile
При осторожном использовании использование пространства имен std
может быть полезным и безвредным одновременно.
Все, что пожелаете. Правда, это не имеет значения. Однако, большинство фрагментов кода используют
using namespace std;
Одно дело рекомендовать записывать полностью квалифицированное имя, когда пространство имен - std, где std:: добавляет только 5 дополнительных символов. Это совсем другая проблема, когда пространство имён складывается, и вы сталкиваетесь с написанием чего-то вроде:
if (NumberOfInstances > 0 && (code_type == MyNamespace::MyLongButMeaningfulClassName::EnumDefinedWithinClass::CODE_GREEN ||
code_type == MyNamespace::MyLongButMeaningfulClassName::EnumDefinedWithinClass::CODE_YELLOW)) {
, особенно если у вас есть путеводитель по стилю компании, ограничивающий строки до 80 символов, и вы добавляете ещё несколько отступов. Что-то вроде этого затуманивает логику кода, стоящего за всем глаголом. В этот момент вы начинаете ценить использование псевдонимов и/или псевдонимов локальных пространств имён в интересах читабельности
.