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

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

using namespace std;

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

17
задан Eight 31 May 2012 в 16:32
поделиться

12 ответов

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

Однако

using namespace std;

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

using std::string;
44
ответ дан 30 November 2019 в 09:58
поделиться

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

using namespace std;

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

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

Подробнее об этом можно прочитать на http://www.cplusplus.com/doc/ учебник / пространства имен / .

0
ответ дан 30 November 2019 в 09:58
поделиться

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

Alternatives:

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

0
ответ дан 30 November 2019 в 09:58
поделиться

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

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

.

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

Ну, конечно, пример несколько надуманный (вы также можете использовать простой и поместить все это в std в ), но ] Бьярн Страуструп показывает этот пример в своем Язык программирования C ++ .

0
ответ дан 30 November 2019 в 09:58
поделиться

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

File common1.h:

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

Usage file:

#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.
}

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

1
ответ дан 30 November 2019 в 09:58
поделиться

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

#include <iostream>
using namespace std;

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

vs.

#include <iostream>

...
std::cout << "Hi" << std::endl;
5
ответ дан 30 November 2019 в 09:58
поделиться

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

using namespace std;

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

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

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

-121--1696293-

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

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

using namespace std;
string myString;

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

std::string myString;

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

using std::string;
string myString;

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

-121--1696297-

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

using std::cout;

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

Пожелания Лэйн

0
ответ дан 30 November 2019 в 09:58
поделиться

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

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

using namespace std;
string myString;

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

std::string myString;

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

using std::string;
string myString;

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

3
ответ дан 30 November 2019 в 09:58
поделиться

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

using namespace std;

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

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

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

3) FAQ 27.5 от Marshall Cline's C ++ Faq lite.

5
ответ дан 30 November 2019 в 09:58
поделиться

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

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


Субъективно, что заставляет меня использовать с использованием пространства имен 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 :: просто создает линейный шум.

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

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

7
ответ дан 30 November 2019 в 09:58
поделиться

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

22
ответ дан 30 November 2019 в 09:58
поделиться

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

std::cout << "I am accessing stdout" << std::endl;
3
ответ дан 30 November 2019 в 09:58
поделиться
Другие вопросы по тегам:

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