включить и использовать пространство имен в C ++ - PullRequest
9 голосов
/ 15 апреля 2010

для использования cout, мне нужно указать оба:

#include<iostream>

и

using namespace std;

Где определено cout? в iostream, правильно? Таким образом, именно iostream находится в пространстве имен std?

В чем смысл обоих утверждений в отношении использования cout?

Я смущен, почему мы должны включить их обоих.

Ответы [ 4 ]

9 голосов
/ 15 апреля 2010

iostream - это имя файла, в котором определяется cout. С другой стороны, std - это пространство имен, эквивалентное (в некотором смысле) пакету java.

cout - это экземпляр, определенный в файле iostream внутри пространства имен std.

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

std::cout с указанием области применения.

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

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

cout<<"Hello world"<<endl;

Это две разные вещи. Один указывает область, другой делает фактическое включение cout.

В ответ на ваш комментарий

Представьте, что в iostream существуют два экземпляра с именем cout в разных пространствах имен

namespace std{
   ostream cout;
}
namespace other{
   float cout;//instance of another type.
}

После включения <iostream> вам все равно потребуется указать пространство имен. Оператор #include не говорит «Эй, используйте cout в std ::». Вот для чего using указать область действия

2 голосов
/ 15 апреля 2010

Если ваша реализация C ++ использует заголовочные файлы в стиле C (многие это делают), то есть файл, который содержит нечто похожее на:

#include ... // bunches of other things included

namespace std {

... // various things

extern istream cin;
extern ostream cout;
extern ostream cerr;

... // various other things

}

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

Говоря

using namespace std;

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

return foo();

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

1 голос
/ 15 апреля 2010

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

.

Все символы в iostream находятся в пространстве имен std. Чтобы использовать символ cout, вы должны указать компилятору, как его найти (т.е. в каком пространстве имен). У вас есть несколько вариантов:

// explicit
std::cout << std::endl;

// import one symbol into your namespace (other symbols must still be explicit)
using std::cout;
cout << std::endl;

// import the entire namespace
using namespace std;
cout << endl;

// shorten the namespace (not that interesting for standard, but can be useful
// for long namespace names)
namespace s = std;
s::cout << s::endl;
0 голосов
/ 15 апреля 2010

#include <iostream> ссылается на заголовочный файл, который определяет cout. Если вы собираетесь использовать cout, то вам всегда понадобится include.

Вам не нужно using namespace std;. Это просто позволяет вам использовать сокращения cout и endl и т. П. Вместо std::cout и std::endl, где пространство имен является явным. Лично я предпочитаю не использовать using namespace ..., поскольку это требует, чтобы я был явным в своем значении, хотя это, по общему признанию, более многословно.

...