Основы алгоритмизации и программирования. Лекция 10

Содержание

Слайд 2

Мем в начале

Мем в начале

Слайд 3

Содержание лекции

Многофайловые программы
Причины использования многофайловых программ
Взаимодействие между файлами
Примеры
Вопросы из теста

Содержание лекции Многофайловые программы Причины использования многофайловых программ Взаимодействие между файлами Примеры Вопросы из теста

Слайд 4

Причины использования

Разделение кодовой базы
Разделение работы над проектом на несколько разработчиков
Удобство организации архитектуры

Причины использования Разделение кодовой базы Разделение работы над проектом на несколько разработчиков
программы
Сокращение кодовой базы
Упрощение внесения правок

Слайд 5

Взаимодействие между файлами

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

Взаимодействие между файлами Взаимодействие между скомпилированными по отдельности, но скомпонованными вместе исходными
(.cpp)
Взаимодействие с заголовочными файлами (.h)

Слайд 6

Взаимодействие исходных файлов

Три основных элемента исходных файлов:
Переменные
Функции
Классы
Для каждого типа элементов есть свои

Взаимодействие исходных файлов Три основных элемента исходных файлов: Переменные Функции Классы Для
правила межфайлового взаимодействия.

Слайд 7

Межфайловые переменные

Объявление переменной – декларация её типа и имени.
Переменная определяется, когда происходит

Межфайловые переменные Объявление переменной – декларация её типа и имени. Переменная определяется,
резервация места под не в памяти.
int some_var;
extern int some_var;

Слайд 8

Межфайловые переменные

// File A
int global_var;
// File B
global_var = 3; // Error!

Межфайловые переменные // File A int global_var; // File B global_var = 3; // Error!

Слайд 9

Межфайловые переменные

// File A
int global_var;
// File B
extern int global_var; // Declaration in

Межфайловые переменные // File A int global_var; // File B extern int
File B
global_var = 3; // Good!
// But:
extern int global_var = 27; // extern will be ignored!

Слайд 10

Статические переменные

// File A
static int global_var; // Only visible in A
// File

Статические переменные // File A static int global_var; // Only visible in
B
static int global_var; // Only visible in B
В этом случае статическая переменная имеет внутреннее связывание. Нестатические глобальные переменные имеют внешнее связывание.
Для сужения области видимости можно использовать также пространства имен.
Полезно: Внутренняя и внешняя линковка в C++

Слайд 11

Совет

Не использовать глобальных переменных
Если очень хочется, и по логике программы переменная используется

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

Слайд 12

Константы

Переменная, определенная с помощью const, в общем случае не видна за пределами

Константы Переменная, определенная с помощью const, в общем случае не видна за
одного файла.
Но если очень нужно:
// File A
extern const int const_var = 99;
// File B
extern const int const_var;

Слайд 13

Межфайловые функции

Объявление функции задает ее имя, тип возвращаемых данных и типы всех

Межфайловые функции Объявление функции задает ее имя, тип возвращаемых данных и типы
аргументов.
Определение функции — это объявление плюс тело функции (тело функции — код, содержащийся внутри фигурных скобок).
Всё, что нужно знать при вызове – это имя, тип и типы аргументов. Все это есть в объявлении функции.

Слайд 14

Пример

// File A
int add(int a, int b) {
return a + b;
}
//

Пример // File A int add(int a, int b) { return a
File B
int add(int, int);
int main() {
cout << add(10, 10) << endl;
return 0;
}

Слайд 15

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

Указанный после директивы #include файл просто вставляется в исходный (например, iostream).
Пример:
#include

Заголовочные файлы Указанный после директивы #include файл просто вставляется в исходный (например,

#include "add.h"

Слайд 16

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

// sum.h
extern int not_found = 404;
int sum(int, int);
// sum.cpp
int sum(int a,

Заголовочные файлы // sum.h extern int not_found = 404; int sum(int, int);
int b) { return a + b; }
// main.cpp
#include "sum.h"
int main() {
cout << sum(10, 10) << endl;
cout << not_found << endl;
// 20
// 404
}

Слайд 17

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

В заголовочном файле можно хранить объявления, но не определения переменных или

Заголовочные файлы В заголовочном файле можно хранить объявления, но не определения переменных
функций.
В противном случае, использование этого файла в других (если только данные не static или const) приведет к ошибке компоновщика «повторные определения».

Слайд 18

Ошибка повторения включений

// example.h
#if !defined(EXAMPLE_H)
#define EXAMPLE_H
int global_var;
int sum(int a, int b) {

Ошибка повторения включений // example.h #if !defined(EXAMPLE_H) #define EXAMPLE_H int global_var; int
return a + b;
}
#endif

Слайд 19

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

Пространства имен предоставляют более гибкий подход к вопросу управления видимостью переменных

Пространства имен Пространства имен предоставляют более гибкий подход к вопросу управления видимостью
и функций.
Пространство имен — это некая именованная область файла.

Слайд 20

Пример

namespace geo {
const double PI = 3.14159;
double L(double radius) {

Пример namespace geo { const double PI = 3.14159; double L(double radius)
return 2 * PI * radius;
}
}
int main() {
cout << geo::PI << endl;
cout << geo::L(10) << endl;
// 3.14159
// 62.8318
}

Слайд 21

Пример: using

namespace geo {
const double PI = 3.14159;
double L(double radius)

Пример: using namespace geo { const double PI = 3.14159; double L(double
{
return 2 * PI * radius;
}
}
L(100); // Not works!
using namespace geo;
L(100); // Works!

Слайд 22

Неоднократное определение пространств имен

namespace geo {
const double PI = 3.14159;
}
// Other

Неоднократное определение пространств имен namespace geo { const double PI = 3.14159;
code ...
namespace geo {
double L(double radius) {
return 2 * PI * radius;
}
}

Слайд 23

Пример

// geo.h
namespace geo {
const double PI = 3.14159;
double L(double radius);
}
//

Пример // geo.h namespace geo { const double PI = 3.14159; double
geo.cpp
#include "geo.h«
double geo::L(double radius) { return 2 * PI * radius; }
// main.cpp
#include "geo.h«
int main() {
cout << geo::PI << endl;
cout << geo::L(10) << endl;
}

Слайд 24

Статические и динамические библиотеки

Библиотека — это фрагмент кода, который можно многократно использовать

Статические и динамические библиотеки Библиотека — это фрагмент кода, который можно многократно
(переиспользовать) в разных программах.
Библиотека в C++ состоит из:
Заголовочный файл, который объявляет функционал библиотеки.
Предварительно скомпилированный бинарный файл, содержащий реализацию функционала библиотеки.
Есть 2 типа библиотек: статические и динамические.

Слайд 25

Статическая библиотека

Статическая библиотека состоит из подпрограмм, которые непосредственно компилируются и линкуются с

Статическая библиотека Статическая библиотека состоит из подпрограмм, которые непосредственно компилируются и линкуются
разрабатываемой программой.
При компиляции программы, которая использует статическую библиотеку, весь необходимый функционал статической библиотеки становится частью исполняемого файла.
В Windows статические библиотеки имеют расширение .lib (library), в Linux .a (archive).

Слайд 26

Статическая библиотека

Преимущество:
Всего лишь один (исполняемый) файл, чтобы пользователи могли запустить и использовать

Статическая библиотека Преимущество: Всего лишь один (исполняемый) файл, чтобы пользователи могли запустить
программу. Статические библиотеки становятся частью программы
Недостатки:
Копия библиотеки становится частью каждого исполняемого файла, что может привести к увеличению размера файла
Для обновления статической библиотеки придется перекомпилировать каждый исполняемый файл, который её использует

Слайд 27

Динамическая библиотека

Динамическая библиотека состоит из подпрограмм, которые подгружаются в разрабатываемую программу во

Динамическая библиотека Динамическая библиотека состоит из подпрограмм, которые подгружаются в разрабатываемую программу
время её выполнения.
При компиляции программы, которая использует динамическую библиотеку, эта библиотека не становится частью исполняемого файла.
В Windows динамические библиотеки имеют расширение .dll (dynamic link library), в Linux .so (shared object).

Слайд 28

Динамическая библиотека

Преимущества:
Разные программы могут совместно использовать одну копию динамической библиотеки, что значительно

Динамическая библиотека Преимущества: Разные программы могут совместно использовать одну копию динамической библиотеки,
экономит используемое пространство
Можно обновить ​​до более новой версии без необходимости перекомпиляции всех исполняемых файлов, которые её используют.
Недостаток:
Механизм взаимодействия может быть непонятен для новичков

Слайд 29

Использование библиотек

Использование библиотек

Слайд 30

Библиотеки импорта

Библиотека импорта (import library) – это библиотека, которая автоматизирует процесс подключения

Библиотеки импорта Библиотека импорта (import library) – это библиотека, которая автоматизирует процесс
и использования динамической библиотеки.
В Windows это обычно делается через небольшую статическую библиотеку (.lib) с тем же именем, что и динамическая библиотека (.dll).
В Linux общий объектный файл (с расширением .so) дублируется сразу как динамическая библиотека и библиотека импорта.

Слайд 31

Пример

// math.h
#if !defined(MATH_H)
#define MATH_H
int round(double r);
#endif
// math.cpp
#include "math.h"
int round(double r) {
return

Пример // math.h #if !defined(MATH_H) #define MATH_H int round(double r); #endif //
(r > 0.0) ? (r + 0.5) : (r - 0.5);
}

Слайд 32

Пример

#include "math.h"
#include
using namespace std;
int main() {
double number;
cout << "Enter

Пример #include "math.h" #include using namespace std; int main() { double number;
the number to round: ";
cin >> number;
cout << round(number) << endl;
}

Слайд 33

Пример: запускаем как обычно

g++ -c app.cpp -o app.o
g++ -c math.cpp -o math.o
g++

Пример: запускаем как обычно g++ -c app.cpp -o app.o g++ -c math.cpp
app.o math.o -o app.out
./app.out
// Enter the number to round: 11.11
// 11

Слайд 34

Пример: статическая библиотека

Получаем файл библиотеки:
ar cr libmath.a math.o
Используем полученный файл библиотеки:
g++ app.o

Пример: статическая библиотека Получаем файл библиотеки: ar cr libmath.a math.o Используем полученный
libmath.a -o app.out
g++ app.o -L. -lmath -o app.out
Проверяем:
./app.out

Слайд 35

Пример: динамическая библиотека

Создаем файл динамической библиотеки:
g++ -shared -o libmath.so math.o
Используем полученный файл

Пример: динамическая библиотека Создаем файл динамической библиотеки: g++ -shared -o libmath.so math.o
библиотеки:
g++ app.o libmath.so -o app.out
g++ app.o -L. -lmath -o app.out
Проверяем:
./app.out
./app.out: error while loading shared libraries: libmath.so: cannot open shared object file: No such file or directory

Слайд 36

В чем проблема?

Пользователь должен подсказать операционной системе, где искать необходимые библиотеки (libmath.so).
В

В чем проблема? Пользователь должен подсказать операционной системе, где искать необходимые библиотеки
случае с Linux:
Добавить путь к библиотеке к переменной окружения LD_LIBRARY_PATH
Использовать флаг -rpath, чтобы указать путь к динамической библиотеке при сборке исполняемого файла

Слайд 37

Исправленный пример

export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/c/dev/OAIP/static_example/
./app.out
Или
g++ app.o -L. -lmath -o app.out -Wl,-rpath,/c/dev/OAIP/static_example/
./app.out

Исправленный пример export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/c/dev/OAIP/static_example/ ./app.out Или g++ app.o -L. -lmath -o app.out -Wl,-rpath,/c/dev/OAIP/static_example/ ./app.out

Слайд 38

Пример вопроса на экзамене

Глобальная переменная определена в файле A. Чтобы получить доступ

Пример вопроса на экзамене Глобальная переменная определена в файле A. Чтобы получить
к ней из файла B, необходимо:
Определить ее в файле B, используя extern;
Определить ее в файле B, используя static;
Расслабиться;
Должно быть константой;
Объявить ее в файле B, используя extern.

Слайд 39

Пример задачи на экзамене

Создать библиотеку для нахождения параметров треугольников (тип треугольника, площадь,

Пример задачи на экзамене Создать библиотеку для нахождения параметров треугольников (тип треугольника,
периметр и т.п.).
Использовать заголовочные файлы и пространства имен.
Имя файла: Основы-алгоритмизации-и-программирования.-Лекция-10.pptx
Количество просмотров: 43
Количество скачиваний: 0