Прототип функции

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску

Прототипом функции в языке Си или C++ называется объявление функции, которое не содержит тело функции, но указывает имя функции, арность, типы аргументов и возвращаемый тип данных. В то время как определение функции описывает, что именно делает функция, прототип функции может восприниматься как описание ее интерфейса.

В прототипе имена аргументов являются необязательными, тем не менее, необходимо указывать тип вместе со всеми модификаторами (например, указатель ли это или константный аргумент).

Пример

В качестве примера, рассмотрим следующий прототип функции:

<source lang="c">int fac(int n);</source>

Этот прототип объявляет функцию с именем "fac", которая принимает один аргумент "n" целого типа и возвращает целое число. Определение функции может располагаться где угодно в программе, но определение требуется только в случае ее использования.

Использование

Уведомление компилятора

Если функция предварительно не была объявлена, а ее имя встречается в выражении, следующим за открывающей скобкой, то она неявно объявляется как функция, возвращающая результат типа int и ничего не предполагается о ее аргументах. В этом случае компилятор не сможет выполнить проверку типов аргументов и арность, когда функция вызывается с некоторыми аргументами. Это потенциальный источник проблем. Следующий код иллюстрирует ситуацию, в которой поведение неявно объявленной функции не определено.

<source lang="c">

  1. include <stdio.h>

/*

* При реализации этого прототипа компилятор выдаст сообщение об ошибке 
* в main(). Если он будет пропущен, то и сообщения об ошибке не будет.
*/

int fac(int n); /* Прототип функции*/

int main(void) /* Вызов функции */ {

   printf("%d\n", fac());   /* ОШИБКА: у fac отсутствует аргумент! */
   
   return 0;

}

int fac(int n) /* Вызываемая функция */ {

   if (n == 0) 
       return 1;
   else 
       return n * fac(n - 1);

} </source>

Функция "fac" ожидает аргумент целого типа, находящийся в стеке при вызове. Если прототип пропущен, компилятор не может это обработать и "fac" завершит операцию на некоторых других данных стека (вероятно, это будет обратный адрес или значение переменной, не входящей в область допустимых значений). Включением прототипа функции вы информируете компилятор о том, что функция "fac" принимает один аргумент целого типа и вы тем самым позволяете компилятору обрабатывать подобные виды ошибок.

Создание библиотечных интерфейсов

Путем помещения прототипов функций в заголовочный файл можно описывать интерфейс для библиотек.

Объявления класса

В C++ прототипы функций также используются в определении классов.

Ссылки

  • Kernighan, Brian W. & Ritchie, Dennis M. (1988), [{{Expansion depth limit exceeded|http://dx.doi.org/{{Expansion depth limit exceeded}}
                 |{{Expansion depth limit exceeded| http://www.ncbi.nlm.nih.gov/pubmed/{{Expansion depth limit exceeded}} 
                  }} 
                 }} The C Programming Language] (2nd ed.), Upper Saddle River, NJ: Prentice Hall PTR, ISBN 0131103628 

Смотри также

de:Funktionsprototyp en:Function prototype ja:関数プロトタイプ pl:Prototyp (oprogramowanie) pt:Protótipo de função uk:Прототип функції

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....