Міжфайлові функції
Підпрограми, виклик яких може здійснюватися з різних файлів багатофайлової програми, називають міжфайловими.
Уточнимо різницю між оголошенням та визначенням функції. Оголошення функції (прототип функції у С/С++) повідомляє компілятору, що десь у програмі може зустрітися функція із вказаним ім’ям, типом значення, яке вона повертає, і типами всіх її аргументів. Визначення функції, яке включає не тільки її оголошення, а й реалізацію, ставить у відповідність імені певну ділянку пам’яті, де зберігається тіло функції.
Коли компілятор генерує виклик функції, йому не треба знати, в який спосіб вона працює. Все, що потрібно йому знати, – це ім’я функції, тип результату і типи параметрів (аргументів). Усі дані стосовно цього містяться в протопиті (оголошенні) функції. Тому для доступу до функції, яка визначена в одному файлі, а її виклики здійснюються з інших, потрібно лише повторити її прототип у тих файлах, які містять оператори її виклику. Наприклад,
// ----------Файл F1----------
int Аdd(int a, int b) // визначення функції Аdd
{ return a+b;
}
// ----------Файл F2----------
int Аdd(int, int); // прототип функції Аdd
. . .
int answer=Аdd(2, 3); // виклик функції Аdd
Специфікатор extern з функціями не використовується, оскільки усі функціїї мов С/С++ є зовнішніми за умовчанням: компілятор здатен відрізнити оголошення від визначення за наявності чи відсутності тіла функції.
Подібно до змінних, функції можна зробити невидимими для інших файлів. Для цього їх треба оголосити із специфікатором static:
// ----------Файл F1----------
static int Аdd(int a, int b) // визначення функції Аdd
{ return a+b;
}
// ----------Файл F2----------
static int Аdd(int a, int b, int с) // Інша функція Аdd
{ return a+b+с;
}
Цей код створює дві різні функції. Жодна з них не є видимою поза файлом, у якому її визначено.
Організація багатофайлових програм
В імперативному програмуванні існує два основних підходи до розробки багатофайлових проектів: багатофайлові програми і так звані бібліотеки визначень (модулі – у Pascal, заголовні файли – у С/С++).
Багатофайлові проекти
Багатофайлові програми характеризуються тим, що включають декілька окремих програмних файлів (cpp-файлів у С/С++), один із яких є головним.
Проілюструємо створення такої програми. Розглянемо програму, яка табулює значення декількох тригонометричних функцій на заданому відрізку. Визначення цих функцій і покажчик на функцію (*func), що розіменовується для доступу до цих функцій, запишемо в файл з ім’ям tabular.cpp, тіло основної програми – у файл aрр.cpp.
//------------------------------------tabular.cpp - файл оголошень і визначень -------------------------------
#include <iostream>
#include <stdio.h>
#include <math.h> // підключення математичної бібліотеки
using namespace std;
float pi=3.14159;
float (*func)(float); //покажчик на функцію
//===== табулювання функції (*func) =====
void Print(float a, float b, float h, float (*func)(float), char s[]) /* a, b - межі відрізка,
h -відстань між точками, s - текстова назва функції*/
{ float x; //значення аргументу функції *func
cout<<"=================="<<endl; //виведення заголовка таблиці
cout<<" x | "<< s <<endl;
cout<<"=================="<<endl;
x=a;
while (x<b) //поки не досягнуто правої межі відрізка
{ printf("%6.2f |", x);
printf("%8.4f \n", (*func)(x)); //обчислити і вивести значення функції
x+=h;
}
}
//--------------------------------------арр.cpp - файл головної функції -----------------------------------------
#include <iostream>
#include <math.h>
using namespace std;
extern float pi;
float lower, upper, step; //межі діапазона, крок
//======== прототипи функцій =========
void Print(float, float, float, float (*)(float), char[]);
//======== головна функція ============
int main()
{ cout<<"Enter lower, upper bounds and step, multiple of pi: ";
cin>>lower>>upper>>step;
lower*=pi; upper*=pi; step*=pi;
Print(lower, upper, step, sin, "sin(x)"); //табулювання стандартної функції sin
Print(lower, upper, step, cos, "cos(x)"); //табулювання стандартної функції cos
system("pause");
}
Результат роботи програми:

