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

Что требует от меня объявления "using namespace std?"?

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

using namespace std;

в программах на С++?

4b9b3361

Ответ 1

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

Однако

using namespace std;

считается плохой практикой, потому что вы фактически импортируете все стандартное пространство имен, открывая тем самым множество возможностей для конфликтов имен. Лучше импортировать только то, что вы на самом деле используете в своем коде, например

using std::string;

Ответ 2

Ничего, это сокращение, чтобы избежать префикса всего в этом пространстве имен с помощью std::

Ответ 3

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

Рассмотрим две следующие функции, которые используют swap().

#include <iostream>
#include <algorithm>

namespace zzz
{
    struct X {};


void swap(zzz::X&, zzz::X&) 
{
    std::cout << "Swapping X\n";
}
}

template <class T>
void dumb_swap(T& a, T& b)
{
    std::cout << "dumb_swap\n";
    std::swap(a, b);
}

template <class T>
void smart_swap(T& a, T& b)
{
    std::cout << "smart_swap\n";
    using std::swap;
    swap(a, b);
}

int main()
{
    zzz::X a, b;
    dumb_swap(a, b);
    smart_swap(a, b);

    int i, j;
    dumb_swap(i, j);
    smart_swap(i, j);
}

dumb_swap всегда вызывает std::swap - хотя мы предпочитаем использовать zzz::swap для zzz::X объектов.

smart_swap делает std::swap видимым как выбор с возвратом (например, при вызове с помощью int), но поскольку он не полностью квалифицирует имя, zzz::swap будет использоваться через ADL для zzz::X.


Субъективно, что заставляет меня использовать using namespace std; - писать код, который использует все виды стандартных объектов функции и т.д.

//copy numbers larger than 1 from stdin to stdout
remove_copy_if(
    std::istream_iterator<int>(std::cin), std::istream_iterator<int>(),
    std::ostream_iterator<int>(std::cout, "\n"),
    std::bind2nd(std::less_equal<int>(), 0)
);

IMO, в коде, подобном этому std::, просто делается для линейного шума.

Я бы не нашел using namespace std; отвратительное преступление в таких случаях, если оно используется в файле реализации (но его можно даже ограничить функциональной областью, как в примере подкачки).

Определенно не помещайте оператор using в файлы заголовков. Причина в том, что это загрязняет пространство имен для других заголовков, которые могут быть включены после оскорбительного, что потенциально может привести к ошибкам в других заголовках, которые могут быть не под вашим контролем. (Это также добавляет фактор неожиданности: люди, включая файл, могут не ожидать видимых имен всех видов.)

Ответ 4

Возможность ссылаться на членов в пространстве имен std без необходимости явно ссылаться на std::member. Например:

#include <iostream>
using namespace std;

...
cout << "Hi" << endl;

против.

#include <iostream>

...
std::cout << "Hi" << std::endl;

Ответ 5

Вы не должны определенно сказать:

using namespace std;

в ваших заголовках С++, потому что это превосходит все точки использования пространств имен (это будет означать "загрязнение пространства имен" ). Вот некоторые полезные ресурсы по этой теме:

1) threadoverflow thread на Стандартное соглашение об использовании "std"

2) статья Херба Саттера о Миграция в пространство имен

3) FAQ 27.5 от Marshall Cline С++ Faq lite.

Ответ 6

Прежде всего, это не требуется, в C - C нет пространств имен. В С++ все в пространстве имен std, которое включает большую часть стандартной библиотеки. Если вы этого не сделаете, вам необходимо явно получить доступ к элементам пространства имен:

std::cout << "I am accessing stdout" << std::endl;

Ответ 7

Во-первых, директива using никогда не требуется в C, поскольку C вообще не поддерживает пространства имен.

Директива using на самом деле не требуется в С++, поскольку любой из элементов, найденных в пространстве имен, может быть доступен напрямую, вместо этого вместо этого префикс их std::. Итак, например:

using namespace std;
string myString;

эквивалентно:

std::string myString;

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

using std::string;
string myString;

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

Ответ 8

Пространства имен - это способ обертывания кода, чтобы избежать путаницы и конфликтов имен. Например:

Файл common1.h:

namespace intutils
{
    int addNumbers(int a, int b)
    {
        return a + b;
    }
}

Файл использования:

#include "common1.h"    
int main()
{
    int five = 0;
    five = addNumbers(2, 3); // Will fail to compile since the function is in a different namespace.
    five = intutils::addNumbers(2, 3); // Will compile since you have made explicit which namespace the function is contained within.

    using namespace intutils;
    five = addNumbers(2, 3); // Will compile because the previous line tells the compiler that if in doubt it should check the "intutils" namespace.
}

Итак, когда вы пишете using namespace std все, что вы делаете, это говорит компилятору, что если он сомневается, он должен искать в пространстве имен std для функций и т.д., для которых он не может найти определения. Это обычно используется в примере (и производственном) коде просто потому, что он делает типизацию общих функций и т.д., Например cout быстрее, чем полностью квалифицировать каждый как std::cout.

Ответ 9

Все файлы в стандартной библиотеке С++ объявляют все свои сущности в пространстве имен std.
например: использовать cin,cout, определенный в iostream

Альтернатива:

using std::cout;
using std::endl;
cout << "Hello" << endl;
std::cout << "Hello" << std::endl;

Ответ 10

Он используется всякий раз, когда вы используете то, что объявлено в пространстве имен. Стандартная библиотека С++ объявляется в пространстве имен std. Поэтому вы должны сделать

using namespace std;

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

std::cout << "cout is declared within the namespace std";

Подробнее об этом можно узнать в http://www.cplusplus.com/doc/tutorial/namespaces/.

Ответ 11

Вам не нужно объявлять использование пространства имен std; использование его - это плохая практика, и вы должны использовать std:: если вы не хотите вводить std:: всегда вы могли бы сделать что-то вроде этого в некоторых случаях:

using std::cout;

Используя std:: вы также можете указать, какая часть вашей программы использует стандартную библиотеку, а какая нет. Что еще более важно, что могут быть конфликты с другими функциями, которые входят в комплект.

Rgds Layne

Ответ 12

Ничто не требует от вас выполнения - если вы не являетесь разработчиком стандартной библиотеки С++, и вы хотите избежать дублирования кода при объявлении файлов заголовков как в "новом", так и в "старом" стиле:

// cstdio
namespace std
{
  // ...
  int printf(const char* ...);
  // ...
}

.

// stdio.h
#include <cstdio>
using namespace std;

Ну, конечно, пример несколько надуманный (вы можете одинаково хорошо использовать простой <stdio.h> и поместить его все в std в <cstdio>), но Bjarne Stroustrup показывает этот пример в языке программирования С++.