програму, що запускається і видає на екран меню з двох пунктів
}
fun1 ()
{ ...
}fun2 ()
{...
}
fun3 ()
{...
}
file1.c
file2. c
Приклад програми з двох файлів
Для того, щоб функція, що визначається могла виконувати будь-які дії, вона повинна використовувати змінні. В мові СІ всі змінні повинні бути оголошені до їхнього використання. Оголошення встановлюють відповідність імені та атрибутів змінної, функції або типу. Визначення змінної викликає виділення пам'яті для зберігання її значення. Клас пам'яті, що виділяється визначається специфікатором класу пам'яті, і визначає час життя і область видимості змінної, зв'язані з поняттям блоку програми. В мові СІ блоком вважається послідовність оголошень, визначень і операторів, укладена в фігурні дужки. Існують два види блоків - складений оператор і визначення функції, що складається з складеного оператора, який є тілом функції, і що передує тілу заголовка функції (в який входять ім'я функції, типи значення ,що вертається і формальних параметрів). Блоки можуть включати в себе складені оператори, але не визначення функцій. Внутрішній блок називається вкладеним.Розглянемо приклад з калькулятором. Він був представлений у вигляді одного вихідного файлу. Якщо ви його набили, то у вас напевне були невеликі труднощі з розташуванням описів в правильному порядку, і довелося використати по меншій мірі один 'фальшивий' опис, щоб компилятор зміг обробити взаємно рекурсивні функції expr (), term () і prim (). В відзначимо, що програма складається з чотирьох частин (лексичного аналізатора, програми синтаксичного розбору, таблиці імен і драйвера), але це ніяк не було відбите в тексті самої програми. По суті, калькулятор був написаний по-іншому. Так це не робиться; навіть якщо в цій програмі 'навикид' зневажити всіма міркуваннми методики програмування, експлуатації і ефективності компіляціє, автор все одно розіб'є цю програму в 200 рядків на декілька файлів, щоб програмувати було приєиніше. Програма, що складається з декількох роздільно компільованих файлів, повинна бути погодженої в сенсі використання імен і типів, точно так же, як і програма, що складається з одного вихідного файлу. В принципі, це може забезпечити і компоновщик.
Компоновщик - це програма, що стикує окремо скомпільовані частини разом. Компоновщик часто (плутаючи) називають загрузчиком. В UNIX компоновщик називається ld. Однак компоновщики, наявні в більшості систем, забезпечують дуже слабку підтримку перевірки погодженості. Програміст може компенсувати нестачу підтримки з боку компоновщика, надавши додаткову інформацію про типи (опису). Після цього погодженість програми забезпечується перевіркою погодженості описів, що знаходяться в окремо компільованих частинах. Засоби, що це забезпечують, в CІ розроблені так, щоб сприяти такій явній компоновці.
Компоновка
Якщо не вказане інше, то ім'я, що не є локальним для функції або класу, в кожній частині програми, зкомпільованій окремо, повинно відноситись до одного і того же типу, значенню, функції або об'єкту. Тобто, в програмі може бути тільки один нелокальный тип, значення, функція або об'єкт з цим ім'ям. Розглянемо, наприклад, два файли: