Изучаем C++. Часть 8. Библиотеки и пространства имён

Разбираемся, как ускорить работу с кодом в несколько раз, используя готовые решения.

Это восьмая часть из серии статей «Глубокое погружение в C++». В прошлой статье мы узнали, как хранить данные в массивах. Сегодня — ещё интереснее.

Недавно мы говорили о том, что многие функции уже написаны другими разработчиками и помещены в специальные библиотеки. Если такая библиотека входит в состав языка или находится в открытом доступе, то вы можете использовать все её возможности.

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

Евгений Кучерявый

Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.


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

Пространство имён (англ. namespace) — это группа взаимосвязанных функций, переменных, констант, классов, объектов и других компонентов программы.

С самого начала изучения C++ мы используем команду std: cout, чтобы выводить данные в терминал. На самом деле команда называется просто cout, а std — это пространство имён, в котором она находится.

Пространства имён нужны, чтобы логически связывать части программы. Например, математические функции, физические, бухгалтерские и так далее.

Вот пример создания пространства имён:

#include <iostream>

//После ключевого слова namespace указываем название пространства имён
namespace mynames
{
    //Всё, что находится внутри этого блока, относится к mynames
    const double Pi = 3.14;

    int sum(int a, int b)
    {
   	 return a + b;
    }
}

int main()
{
    //Для вызова функции sum нужно сначала указать пространство имён
    int a = mynames::sum(5, 12);

    std::cout << "a = " << a << "\n";

    //Так же при использовании переменных и констант
    std::cout << "Pi = " << mynames::Pi << "\n";
}

Мы объединяем в группу несколько разных команд и избегаем конфликтов имён. Это нужно, когда в какой-то из подключённых вами библиотек уже есть функция, например sum (). По пространству имён программа поймёт, какая именно функция вам нужна.

Если же вы хотите сократить код, то используйте команду using:

using namespace std;
using namespace mynames;

int main()
{
    int a = sum(5, 12);

    cout << "a = " << a << "\n";
    cout << "Pi = " << Pi << "\n";
}

В данном случае команда говорит, что вам нужны имена из mynames и std, поэтому никакой ошибки выведено не будет.

Также после using можно указать не целое пространство имён, а только отдельную функцию или переменную:

//Подключить пространство имён std
using namespace std;

//Подключить функцию sum() из пространства имён mynames
using mynames::sum;

int main()
{
    int a = sum(5, 12);

    cout << "a = " << a << "\n";
    cout << "Pi = " << mynames::Pi << "\n";
}

Файлы заголовков в C++

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

Для этого создайте файл заголовков — сохраните код с расширением .h, например mylib.h:

namespace mymath
{
    const double Pi = 3.14;

    int sum(int a, int b)
    {
   	 return a + b;
    }

    int pow(int base, int exponent)
    {
   	 int result = base;

   	 for(int i = 1; i < exponent; i++)
   	 {
   		 result *= base;
   	 }

   	 return result;
    }
} 

Здесь нет функции main (), потому что этот код — не самостоятельная программа, а библиотека для других программ. Следовательно, точка входа здесь не нужна. Также мы не подключаем iostream, потому что не собираемся ничего выводить, но вы можете добавить в свой заголовок любые другие файлы.

//Подключаем в нашу библиотеку две другие
#include <iostream>
#include <cmath>

namespace math2
{
	void printPow(int base, int exponent)
	{
    	    //Обратите внимание, что функция pow(), которая находится в cmath, не относится ни к какому пространству имён
              //Точно так же вы можете создавать библиотеки без пространств имён
    	    int result = pow(base, exponent);

    	    std::cout << base << "^" << exponent << " = " << result << "\n";
	}
}

Поместите mylib.h в папку, где находится ваша программа. Затем добавьте в начало кода команду:

#include "mylib.h"

Обратите внимание на двойные кавычки вместо угловых скобок: первые используются для локальных заголовков, а вторые — для системных.

Теперь вы можете использовать весь функционал из этой библиотеки:

#include <iostream>
#include "mylib.h"

using namespace std;

int main()
{
    int base = 5;
    int exponent = 4;

    int result = mymath::pow(base, exponent);

    cout << base << "^" << exponent << " = " << result << "\n";
}

Вот что будет выведено:

Обратите внимание, что функция pow, как и другие математические функции, существует также и в библиотеке cmath.

Заключение

Библиотеки и пространства имён — это полезные инструменты для каждого разработчика. В интернете есть готовые решения для любых задач, поэтому многие работодатели ищут специалистов, которые разбираются в определённой библиотеке.

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

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

Курс

Профессия
Разработчик на C++ с нуля


Вы пройдёте полный курс по С++ и прикладной курс по Unreal Engine 4. Вы научитесь работать с многопоточностью, использовать инструменты и средства разработки: Git, GCC, GDB. Вам будет проще найти работу программиста в геймдеве.

Хочешь получать крутые статьи по программированию?
Подпишись на рассылку Skillbox