Використання прототипів функції, програмування на c і c
Стандарт ANSI З розширює концепцію попереднього опису функції. Дане розширений опис називається прототипом функції.
Прототипи функцій служать двом цілям: по-перше, вони визначають тип повертається функцією значень, щоб компілятор міг генерувати коректний код для повертаються даних; по-друге, вони визначають тип і число аргументів, які використовуються функціями. Прототип має такий вигляд:
тип імя_функциі (список параметрів);
Прототип зазвичай поміщається в початок програми і повинен з'являтися перед будь-яким викликом функції.
Крім цього, для інформування компілятора про тип повертається функцією значення прототип функції дозволяє З здійснювати якісну перевірку типів, на зразок перевірки, здійснюваної в таких мовах, як Паскаль. Прототипи дозволяють компілятору знайти і повідомити інформацію про всі незаконні перетвореннях типів між типами аргументів, які використовуються при виконанні функції, і типами певних параметрів. Також компілятору дозволяється повідомляти про те, що функція викликається з неправильним числом аргументів.
Якщо можливо, С автоматично перетворює тип аргументу в тип, одержуваний параметром. Тим не менш, деякі перетворення типів неприпустимі. Якщо функція має прототип, то всі нелегальні перетворення будуть знайдені і з'явиться повідомлення про помилку. Як приклад, наступна програма викликає повідомлення про помилку, оскільки намагається викликати func () з покажчиком, а не з необхідним float. (Не можна перетворити покажчик до типу float.)
/ * Дана програма використовує прототипи функцій для досягнення суворої перевірки типів при виклику func (). Програма не компілюється через невідповідність між типом аргументів, визначених у прототипі функції, і типом аргументів, які використовуються при виконанні функції. * /
#include
float func (int x, float у); / * Прототип * /
int main (void)
int x, * y;
x = 10;
у = x;
func (x, у); / * Невідповідність типів * /
return 0;
>
float func (int x, float y)
printf ( "% f", у / (float) x);
return у / (float) x;
>
Використання прототипів також дозволяє компілятору видавати повідомлення в разі, якщо число використовуваних при виконанні функції аргументів не відповідає числу параметрів, визначених в функції. Наприклад, наступна програма не компілюватися, оскільки func () викликається з неправильним числом аргументом:
/ * Програма не компілюється через невідповідність між числом параметрів, визначених в прототипі функції, і числом аргументів, які використовуються при виконанні функції. * /
#include
float func (int x, float у); / * Прототип * /
int main (void)
func (2, 2.0, 4); / * Невірне число аргументів * /
return 0;
>
З технічної точки зору при створенні прототипу функції не потрібно включати справжні імена параметрів. Наприклад, такі два варіанти абсолютно коректні і рівнозначні:
char func (char *, int);
char func (char * str, int count);
Проте, якщо включити імена параметрів, компілятор використовує імена для видачі повідомлень про невідповідність типів.
Деякі функції типу printf () можуть приймати змінне число аргументів. Змінне число аргументів визначається в прототипі за допомогою трьох крапок. Наприклад, прототип функції printf () виглядає так:
int printf (const char * fmt.);
Для створення функції зі змінним числом аргументів треба звернутися до опису стандартної бібліотечної функції va_arg ().
Слід використовувати прототипи функцій для запобігання помилок, що з'являються в результаті викликів функцій з неправильними аргументами. Вони також допомагають перевірити правильність роботи програми, не дозволяючи функцій викликатися з неправильним числом аргументів. Як раніше згадувалося, вони потрібні в С ++.