прототип функції
У сучасних, правильно написаних програмах на мові С кожну функцію перед використанням необхідно оголошувати. Зазвичай це робиться за допомогою прототипу функції. У первинному варіанті мови С прототипів не було; але вони були введені вже в Стандарт С89. Хоча прототипи формально не потрібні, але їх використання дуже бажано. (Втім, в C ++ прототипи обов'язкові!) У всіх прикладах цієї книги є повні прототипи функцій. Прототипи дають компілятору можливість ретельніше виконувати перевірку типів, подібно до того, як це робиться в таких мовах як Pascal. Якщо використовуються прототипи, то компілятор може виявити будь-які сумнівні перетворення типів аргументів, необхідні при виконанні функції, якщо тип її параметрів відрізняється від типів аргументів. При цьому будуть видані попередження про всі такі сумнівних перетвореннях. Компілятор також виявить відмінності в кількості аргументів, використаних при виконанні функції, і в кількості параметрів функції.
У загальному вигляді прототип функції повинен виглядати таким чином:
Використання імен параметрів не обов'язково. Однак вони дають можливість компілятору при наявності помилки вказати імена, для яких виявлено невідповідність типів, так що не полінуйтеся вказати цих імен - це дозволить заощадити час згодом.
Наступна програма показує, наскільки цінними є прототипи функцій. У ній виводиться повідомлення про помилку, що походить з-за того, що програма містить спробу виклику sqr_it () з цілим аргументом, в той час як потрібно покажчик на ціле.
Як прототип функції може також служити її визначення, якщо воно знаходиться в програмі до першого виклику цієї функції. Ось, наприклад, правильна програма:
Єдина функція, для якої не потрібно прототип - це main (). так як це перша функція, що викликається на початку роботи програми.
Є невелика, але важлива різниця в тому, як саме в С і C ++ обробляється прототип функції, що не має параметрів. У C ++ порожній список параметрів вказується повною відсутністю в прототипі будь-яких параметрів. наприклад,
Якщо функція в мові С не має параметрів, то в її прототипі всередині списку параметрів варто тільки ключове слово void. Ось, наприклад, прототип функції f () в тому вигляді, в якому він повинен бути в програмі на мові С:
Таким чином компілятор дізнається, що у функції немає параметрів, і будь-яке звернення до неї, в якому є аргументи, буде вважатися помилкою. У C ++ використання ключового слова void всередині порожнього списку параметрів також дозволено, але вважається зайвим.
Прототипи функцій дозволяють "відловлювати" помилки ще до запуску програми. Крім того, вони забороняють виклик функцій при розбіжності типів (тобто з невідповідними аргументами) і тим самим допомагають перевіряти правильність програми.
І наостанок хотілося б сказати наступне: так як в ранніх версіях З синтаксис прототипів в повному обсязі не підтримувався, то в С прототипи формально не обов'язкові. Такий підхід необхідний для сумісності з С-кодом, створеним ще до появи прототипів. Але якщо старий С-код переноситься в C ++, то перед компіляцією цього коду в нього необхідно додати повні прототипи функцій. Пам'ятайте, що хоча прототипи в С не обов'язкові, але вони є обов'язковими в C ++. Це означає, що кожна функція в програмі на мові C ++ повинна мати повний прототип. Тому при написанні програм на С в них вказуються повні прототипи функцій - саме так чинить більшість програмістів, які працюють на цій мові.
Згідно старомодному підходу, тип результату і ім'я функції, як показано нижче, оголошуються майже що на початку програми: