Include iostream using namespace std

Include iostream using namespace std

Обновл. 30 Ноя 2019 |

В этом уроке мы рассмотрим, что такое конфликт имён в C++ и как его решать с помощью пространств имён и оператора разрешения области видимости.

Конфликт имён в C++

Допустим, что вам нужно съездить к дальним родственникам в другой город. У вас есть только их адрес: г. Ржев, ул. Вербовая, 13. Попав в город Ржев, вы открываете Google Карты/Яндекс.Карты и видите, что есть две улицы с названием «Вербовая», ещё и в противоположных концах города! Какая из них нужна вам? Если у вас нет никакой дополнительной информации (например, вы знаете, что их дом находится возле аптеки или школы), вам придётся позвонить им и спросить. Чтобы подобной путаницы не возникало, все названия улиц в городе должны быть уникальными.

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

Пример конфликта имён:

По отдельности файлы a.cpp, b.cpp и main.cpp скомпилируются. Однако, если a.cpp и b.cpp разместить в одном проекте — произойдёт конфликт имён, так как определение функции doSomething() находится сразу в обоих файлах.

Большинство конфликтов имён происходят в двух случаях:

Файлы, добавленные в один проект, имеют функцию (или глобальную переменную) с одинаковыми именами (ошибка на этапе линкинга).

Файл .cpp подключает заголовочный файл, в котором идентификатор конфликтует с идентификатором из файла .cpp (ошибка на этапе компиляции).

Как только программы становятся больше — используется больше идентификаторов. Следовательно, вероятность возникновения конфликта имён значительно возрастает. Хорошая новость заключается в том, что C++ предоставляет достаточно механизмов для предотвращения возникновения конфликтов имён (например: локальная область видимости или пространства имён).

Читайте также:  Как настроить правильное время на компьютере

Пространство имён

В первых версиях C++ все идентификаторы из стандартной библиотеки C++ (такие как cin/cout и т.д.) можно было использовать напрямую. Тем не менее, это означало, что любой идентификатор из стандартной библиотеки С++ потенциально мог конфликтовать с именем, которое вы выбрали для ваших собственных идентификаторов. Код, который работал, мог внезапно получить конфликт имён при подключении нового заголовочного файла из стандартной библиотеки С++. Или, что ещё хуже, код, написанный по стандартам одной версии С++, мог уже не работать в новой версии С++. Чтобы решить эту проблему, весь функционал стандартной библиотеки С++ перенесли в специальную область — пространство имён (англ. «namespace»).

Так как город гарантирует, что все улицы в его пределах имеют уникальные имена, так и пространство имён гарантирует, что все его идентификаторы — уникальны.

Таким образом, std::cout состоит из двух частей: идентификатор cout и пространство имён std. Весь функционал стандартной библиотеки C++ определён внутри пространства имён std (сокращенно от англ. «standard»).

Мы ещё поговорим о пространствах имён в следующих уроках, а также расскажем, как создать свой собственный namespace. Сейчас, главное, что вам нужно запомнить — всякий раз, когда вы используете идентификаторы из стандартной библиотеки С++ (например, cout), вы должны сообщать компилятору, что этот идентификатор находится внутри пространства имён std.

Правило: При использовании идентификаторов из пространств имён — указывайте используемые пространства имён.

Оператор разрешения области видимости ::

Самый простой способ сообщить компилятору, что определённый идентификатор находится в определённом пространстве имён — использовать оператор разрешения области видимости ::. Например:

I am currently using Teach Yourself C++ in 21 Days, Second Edition book to learn about C++ coding, along with Microsoft Visual C++ 2010 Express. At the end of Chapter 1, there is a small exercise about writing and compiling the following code:

Читайте также:  Разгон видеокарты 1060 3gb для игр

Quite simple, right? However to my surprise the code would not compile, due to this error:

error C2065: ‘cout’ : undeclared identifier

I began scouring the Web, and soon found some solutions here. Turns out I had to add using namespace std; to my code!

However there was no mention of namespaces in the book, so I figured the book is outdated. (It uses #include pre-processor directive!) After some more Web research I found a lot of information about namespaces, namespace std , along with some historical background on and , and all this flow of new information is quite confusing to me. (Not to mention all the unnecessary Google results about medical STDs. )

So here are some questions I’ve got so far:

  1. If I am including the iostream library, why is a namespace needed to find cout ? Is there another cout somewhere that could cause a name clash? If someone could provide a diagram for this, that’d be great.

And as a bonus, some historical background:

What exactly was iostream.h before it was changed to iostream ?

a e d BsnaG LiKs b w y D LckF J Usv e aH t j B aV r Y a g i Ru n DkS s YUbhj

Answer Wiki

  • #include Directive

The #include directive tells the preprocessor to insert the contents of another file into the source code at the point where the #include directive is found.

Include directives are typically used to include the C++ / C header files for functions that are held outside of the current source file.

A header that defines the standard input/output stream objects. Mainly used for cin and cout .

Suppose if you have a function called max() and there is another library available which also having some function max() . Now compiler has no way of knowing which max() functi.

Ссылка на основную публикацию
Adblock
detector