KIMMO‑DEVELOPER
Команда вольных программистов
Из чего состоит программа на C++

Структура программы

Делая первые шаги в изучении любой области хочется побыстрее приступить к практике. Но чтобы упражнения приносили пользу, важно обзавестись набором базовых знаний. В прошлой статье мы поговорили о выборе IDE, а теперь рассмотрим, структуру программы на языке С++.

Из чего состоит программа

Возьмем стандартный код «первой программы» и подробно разберем каждый элемент:

  1. #include <iostream>
  2. int main()
  3. {
  4. std::cout << "Hello world!" << std::endl;
  5. return 0;
  6. }

Заголовочные файлы

Для создания программы не всегда необходимо писать весь код с нуля. В C++ существует большое количество стандартных функций, которые можно использовать. В рамках обучения полезно написать многие функции самостоятельно, ведь осваивая язык программирования очень важно практиковаться, «набивать руку». А вот при разработке проектов рациональнее использовать уже готовый код, что значительно сокращает время создания программ.

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

  1. #include <iostream>

Название представляет собой сокращение от Input/Output Stream («поток ввода-вывода»).

То есть мы используем #include и дальше в <> или кавычках вписываем название нашего файла заголовка. В следующих уроках мы рассмотрим некоторые другие стандартные заголовочные файлы и научимся подключать свои, а также рассмотрим их отличия.

Функция main

Теперь давайте рассмотрим вот такой блок:

  1. int main()
  2. {
  3. return 0;
  4. }

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

Сейчас же хочу пояснить строку 6 нашего примера. Мы видим оператор возврата  return 0; . Он говорит нам, успешно ли завершилась программа. Если в операционную систему возвращается ноль, программа завершилась успешно.

Посмотреть этот результат мы можем в логах отладчика (обычно располагается внизу окна программы):

Окно отладки

Также, если активированны соответствующие настройки, результат выводится в самом консольном окне в конце выполнения программы. Вот так это выглядит в Visual Studio:

Return в Visual Studio

А вот так в CodeBlocks:

Return в CodeBlocks

Инструкция вывода текста

Между фигурными скобками нашей функции main() кроме оператора возврата мы видим вот такую строку:

  1. std::cout << "Hello world!" << std::endl;

Эта запись является инструкцией и должна заканчиваться точкой с запятой. Давайте разберем, из чего она состоит:

  • std::cout — используется для вывода информации в консоли. Находится в стандартной библиотеке, которую мы подключили выше (об этом говорит префикс std::). Другими словами, если нам необходимо вывести текстовую информацию в консольном окне, нужно использовать эту конструкцию.
  • <<  — это оператор вывода. Нужен, чтобы передать информацию для вывода в конструкцию std::cout . Для передачи нескольких объектов (например, текст и значение переменной) перед каждым ставится этот оператор.
  • "Hello, World!" — все, что между кавычек, воспринимается как текстовая строка. О переменных же и их выводе на экран мы поговорим в следующем уроке.
  • std::endl — конструкция используется для перевода строки (деления на абзацы).

Использование пространства имен

Вы могли заметить, что в строке 5 мы несколько раз используем префикс std:: . В первый раз перед командой cout, второй раз — перед endl. Конструкция std:: говорит компилятору, что этот элемент надо искать в пространстве имен std — стандартной библиотеке С++. Мы подключили этот заголовочный файл в первой строке, использовав конструкцию #include.

Зачем все эти сложности, спросите Вы? Неужели нет более удобного способа использовать стандартную библиотеку?

На самом деле есть. Иногда используется конструкция:

  1. using namespace std;

Например, при создании проекта в CodeBlocks по умолчанию эта строка присутствует в коде.

Namespace — это пространство имен. Другими словами, некий объект, внутри которого все имена (названия) уникальные.

Если работаете над собственным небольшим проектом, вероятно Вы знаете все название, которые давали объектам. Однако при работе над большими проектами или (особенно) работе в команде у Вас скорее всего не будет времени и необходимости полностью разбирать все строки кода своих коллег. Чтобы все разработчики могли не беспокоиться о конфликтах имен и давать своим объектам удобные наименования и созданы пространства имен.

Однако, в рассмотренном способе подключения есть подводные камни. Давайте посмотрим на наш пример. Cout используется для вывода данных на экран. Предопложим, что мы не знаем об этой функции и называем этим названием свою. Тогда компилятор не поймет, о какой именно cout идет речь и откажется компилировать нашу программу.

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

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

  1. using std::cout;

Дальше в коде уже не нужно будет использовать префикс std:: — компилятор поймет, что с этого момента cout всегда будет относиться к стандартной библиотеке.

Поиск и исправление ошибок компиляции

Хорошо, если с первого раза у вас все получилось. Однако, написанная Вами программа может не запуститься. Важно научиться справляться с такими ситуациями. В рамках урока мы не будем рассматривать все. Их много, а большинство решений (если не все) уже рассмотрены в интернете. Мы сейчас разберем алгоритм поиска и исправления ошибок.

Давайте уберем из нашей программы объявление пространства имен и “забудем” указать его префиксы. Наш тестовый код будет выглядеть вот так:

  1. #include <iostream>
  2. int main()
  3. {
  4. cout << "Hello world!" << endl;
  5. return 0;
  6. }

На этот раз мы рассмотрим ситуацию на примере Code::Blocks, но в Visual Studio ситуация будет аналогичной.

Если компиляция не удается, в нижней части окна мы може посмотреть, какие ошибки мешают нашей программе выполниться.

Ошибки компиляции

Ошибки следует исправлять по очереди. Первой красным подсвечивается ошибка в 7 строке в файле main.cpp

error: ‘cout’ was not declared in this scope

Что-то не так с нашим cout — он «не объявлен в этой области (видимости)». Добавим к нему префикс std:: и посмотрим, что получится.

Оставшиеся ошибки компиляции

Вот, мы исправили первую ошибку. Вторую мы исправим аналогичным образом, и наша программа успешно заработает.

Всегда надо разбираться, что именно вызвало ошибку. Например, аналогичная ситуация может быть вызвана, если мы забудем подключить #include <iostream>. Тогда даже если у Вас будет прописано using namespace std; или префиксы std:: в нужных местах, программа не заработает.

Мы рассмотрели простой пример. Обычно по тексту ошибки можно понять, что мы сделали неправильно. Если у Вас не получаетя разобраться самостоятельно, можно скопировать текст ошибки в любимую поисковую систему. Скорей всего она уже у кого-нибудь возникала и Вы сможете найти решение в интернете.

Домашнее задание

  1. Попробуйте запустить программу «Hello,world», используя разный код:
    • используйте префиксы std::;
    • используйте using namespase std;
    • используйте using std::cout и using std::endl;