Что требует, чтобы я объявил “используя пространство имен std;”?

StackOverflow https://stackoverflow.com/questions/2218140

Вопрос

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

using namespace std;

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

Это было полезно?

Решение

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

Однако,

using namespace std;

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

using std::string;

Другие советы

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

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

Рассмотрим две следующие функции, которые используют 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 виден как запасной вариант (например, при вызове с целыми числами), но поскольку он не полностью определяет имя, 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)
);

ИМХО, в таком коде std:: просто создает линейный шум.

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

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

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

#include <iostream>
using namespace std;

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

против.

#include <iostream>

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

Категорически не следует говорить:

using namespace std;

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

1) поток stackoverflow включен Стандартное соглашение об использовании «std»

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

3) Часто задаваемые вопросы 27.5 из Часто задаваемых вопросов по C++ Маршалла Клайна.

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

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

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

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

using namespace std;
string myString;

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

std::string myString;

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

using std::string;
string myString;

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

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

Файл 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.

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

using std::cout;

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

Rgds Layne

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

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

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

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

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

.

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

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

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

using namespace std;

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

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

Вы можете прочитать больше об этом по адресу http://www.cplusplus.com/doc/tutorial/namespaces/.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top