Вам не потрібно бачити повне тіло функції, щоб знати, як викликати її. Вам потрібна лише обіцянка. Такою обіцянкою є прототип функції.
У сучасному C попереднє оголошення прототипів є обов’язковим. Воно повідомляє компілятор, чого саме очікує функція: ім’я, типи аргументів і значення, що повертається. Без нього ви дієте наосліп. А в C сліпота коштує дорого.
Прихована вартість відсутності прототипів
Розгляньте цей фрагмент коду. Він виглядає безневинно. Він компілюється. Він виконується.
`
Тут add явно вимагає два цілих числа. Але виклик передає лише один. Суворий компілятор мав би обуритися. Багато хто цього не робить. Вони за умовчанням припускають, що тип, що повертається – int, і повністю ігнорують невідповідність параметрів.
Результат? Неправильні відповіді Тихе псування даних. Ви витрачаєте годинник на пошук помилки, що дивилася на вас прямо в обличчя в другому рядку.
Це тому, що успадковане поведінка C за умовчанням передбачає, що функції без прототипів повертають int. Якщо фактична функція повертає float, компілятор неправильно інтерпретує біти. Прототип виправляє це. Він забезпечує дотримання договору.
Забезпечення дотримання контракту
Розмістіть прототип на початку. Десь перед першим викликом.
`
Тепер компілятор зазначає помилку. Він знає, що add вимагає два аргументи. Він відмовляється компілювати виклик із невідповідними аргументами. Ви заощаджуєте годинник налагодження.
Старий стиль проти сучасного C
Не-ANSI компілятори це зовсім інша історія. Вони дозволяють використовувати прототипи, але із застереженням. Список параметрів має бути порожнім.
`
Це повідомляє компілятор ім’я і тип, що повертається. Він нічого не говорить про аргументи. Перевірка помилок не відбувається. Ви повертаєтеся до вихідної точки.
Сучасний C (стандарт ANSI) потребує явної вказівки типів у прототипі. Це усуває неоднозначність. Він виявляє невідповідність типів. Він виявляє відсутність аргументів. Він виявляє все.
Практичні кроки
- Рефакторинг бульбашкового сортування. Перенесіть логіку у функцію. Оголосіть прототип. Передавайте масив та розмір явно.
- Ізоляція введення. Створіть окрему функцію для введення користувача. Не захаращуйте
main. Оголосіть прототип. Протестуйте його.
Не про бали за стиль. Мова про коректність.
Прототип — це контракт, який забезпечує компілятор. Порушіть його, і збирання завершиться помилкою.
Ви можете поставити запитання, чому це важливо, якщо ваш код працює. Це важливо тому, що помилки часу виконання складніше виправляти, ніж помилки часу компіляції. Помилка компіляції зупиняє вас. Помилка часу виконання ховається у продакшені.
Різниця між надійною та тендітною програмою часто зводиться до цих кількох рядків на початку. Не пропускайте їх.
Компілятор існує, щоб допомогти. Дослухайтеся до нього.















































