Подтвердить что ты не робот

Стандартная конвенция для использования "std"

Точный дубликат: Вы предпочитаете явные пространства имен или 'использование на С++?

Какое из них является предпочтительным соглашением для использования любого пространства имен?

using namespace std;

или

using std::cin;
using std::cout;

или

вызов функции по мере необходимости в коде?

std::cout<<"Hello World!"<<std::endl;
4b9b3361

Ответ 1

Очень хорошее объяснение дано здесь.

Первый стиль, т.е. использование пространства имен, которое портит всю цель пространства имен. Вы никогда не должны использовать его, кроме небольших фрагментов кода. (Я тоже не использую его: D)

Второй - слишком многословный. Непрактично.

Мне лично нравится третий стиль, то есть печатать полное имя (например, std:: cout).

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

Ответ 2

Это было задано много раз раньше, но мой SO search fu, кажется, покинул меня на данный момент. В основном:

  • Никогда не помещайте директиву использования любого типа в файл заголовка – это будет загрязнять ваш код и вводить всевозможные трудности для отслеживания ошибок.

  • Предпочитаете использовать декларацию using, например using std::string, в файле реализации (.cpp), который сильно использует такой тип.

  • В качестве последнего средства используйте using namespace std, но только в файлах реализации; ndash; Я использую его в сообщениях компилируемого кода на SO, для удобства.

Ответ 3

Это модифицированная версия другого ответа, который я написал по тому же вопросу. Хватит этих вопросов, и, возможно, я получу окончательный пост;)

Основная проблема - конфликты имен, в том случае, если у вас есть переменная cout в вашем коде, и вы using namespace std;, это будет неоднозначно относительно того, что вы имеете в виду. Это не просто cout. count, reverse и equal также будут включены, которые являются общими идентификаторами.

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


Также стоит отметить, что вы никогда не должны ставить

using namespace std;

В заголовочном файле, поскольку он может распространяться на все файлы, содержащие этот заголовочный файл, даже если они не хотят использовать это пространство имен. Другая проблема заключается в том, что также неясно, что пространство имен std было импортировано, поэтому сопровождающий (или вы через 3 месяца) добавляет переменную с тем же именем, что и некоторая неясная функция std, которая была включена в один и тот же блок компиляции и затем тратит час, пытаясь найти причину ошибки компиляции.

В большинстве случаев очень полезно использовать такие вещи, как

using std::swap

Как будто есть специальная версия swap, компилятор будет использовать это, иначе он вернется на std::swap. Если вы вызываете std::swap, вы всегда используете базовую версию, которая не будет вызывать специализированную версию (даже если она существует).

Возьмем, к примеру, код, используя pimpl idiom. Если копия по умолчанию может скопировать все данные в фактическую реализацию, где все, что требуется, - это замена указателей. Использование специализированного свопа может сэкономить огромное количество времени выполнения, а хорошо спроектированные библиотеки должны его специализировать.


Итак,

  • Всегда предпочитайте using std::swap над std::swap()

  • Избегайте using namespace std в заголовке любой ценой из-за распространения, старайтесь не использовать его в файлах реализации.

  • Наличие тысяч using std::foo в верхней части каждого файла - это не путь. В большинстве случаев используйте его для общеупотребительных классов.

Все остальное - мнение.

Ответ 4

Я лично предпочитаю третий вариант. Просто взгляните на это:

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

Хотя для ввода кода потребуется немного больше времени, второй и третий варианты предпочтительнее.

Ответ 5

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

#include <iostream>
using namespace std; // Pollution!

int main()
{
    ....
}

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

#include <iostream>

int main()
{
    using namespace std; // Good!
    ....
}

Ответ 6

Я хотел бы отметить, что using namespace foo имеет область действия. Пример:

#include <iostream>
#include <vector>
//...
for (int i=0; i<10; ++i)
{
    using namespace std;
    cout << i << endl;
}
vector v; // won't compile

При использовании с осторожностью using namespace std может быть полезным и безвредным в одно и то же время.

Ответ 7

Я всегда перечисляю полное пространство имен. Это улучшает читаемость и позволяет другим людям узнать, откуда берутся ваши функции и данные. using очень раздражает, когда читаешь код других людей, особенно когда я пытаюсь чему-то научиться, потому что я не могу сказать, является ли это частью этого пространства имен или другого. И, как говорят другие здравомыслящие люди, он побеждает весь смысл пространства имен, не так ли? Дело в том, чтобы держать все в отдельности и придавать смысл данным и логике.

Хороший порядок запоминания: самым важным человеком является клиент, который использует программу; вторых, наиболее важными являются другие кодеры, которые либо поддерживают, либо пытаются учиться у вашего кода; Меньше всего это важно.: -)

Ответ 8

Одно дело рекомендовать выписывать полное имя, когда пространство имен является std, где std:: только добавляет 5 дополнительных символов. Это целая проблема, когда пространство имен стека, и вы сталкиваетесь с написанием чего-то вроде:

if (NumberOfInstances > 0 && (code_type == MyNamespace::MyLongButMeaningfulClassName::EnumDefinedWithinClass::CODE_GREEN ||
                              code_type == MyNamespace::MyLongButMeaningfulClassName::EnumDefinedWithinClass::CODE_YELLOW)) {

особенно если у вас есть ориентир для фирменного стиля, ограничивающий линии до 80 символов, и вы добавляете еще несколько отступов. Что-то вроде этого скрывает логику кода за всеми формулировками. В этот момент вы начинаете ценить использование и/или локальных псевдонимов пространства имен в интересах удобочитаемости.

Ответ 9

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

using namespace std;