Стандартная конвенция для использования “станд.”

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

Какой из них является предпочтительной конвенцией для использования какого-либо пространства имен?

using namespace std;

или

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

или

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

std::cout<<"Hello World!"<
11
задан Community 23 May 2017 в 11:47
поделиться

9 ответов

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

Основная проблема - конфликты имен, в том, что если у вас в коде есть переменная с именем 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 в верхней части каждого файла - это не лучший путь. В лучшем случае используйте его для классов общего пользования.

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

.
8
ответ дан 3 December 2019 в 01:53
поделиться

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

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

.
1
ответ дан 3 December 2019 в 01:53
поделиться

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

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

Хотя для набора кода может потребоваться немного больше времени, вторая и третья опции являются более (вроде) предпочтительными.

3
ответ дан 3 December 2019 в 01:53
поделиться

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

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

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

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

12
ответ дан 3 December 2019 в 01:53
поделиться

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

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

int main()
{
    ....
}

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

#include <iostream>

int main()
{
    using namespace std; // Good!
    ....
}
1
ответ дан 3 December 2019 в 01:53
поделиться

Я просто хотел бы отметить, что , используя пространство имён foo, обнаружено. Пример:

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

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

1
ответ дан 3 December 2019 в 01:53
поделиться

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

using namespace std;
-4
ответ дан 3 December 2019 в 01:53
поделиться

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

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

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

.
0
ответ дан 3 December 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: