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

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

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

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

Содержание

[править] Пример

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

int myFunction(int n);

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

[править] Использование

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

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

#include <stdio.h>
 
/* 
 * При реализации этого прототипа компилятор выдаст сообщение об ошибке 
 * в main(). Если он будет пропущен, то и сообщения об ошибке не будет.
 */
 
int myFucntion(int n);              /* Прототип функции */
 
int main(void) /* Вызов функции */
{                 
    printf("%d\n", myFucntion());   /* ОШИБКА: у myFucntion отсутствует аргумент! */
 
    return 0;
}
 
int myFucntion(int n) /* Вызываемая функция  */
{             
    if (!n) 
        return 1;
    else 
        return n * myFucntion(n - 1);
}

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

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

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

[править] Объявления класса

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

[править] Ссылки

  • Kernighan, Brian W. & Ritchie, Dennis M. (1988), The C Programming Language (2nd ed.), Upper Saddle River, NJ: Prentice Hall PTR, ISBN 0131103628 

[править] См. также

Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Участие
Печать/экспорт
Инструменты
На других языках