Урок 9.2. Объявление и определение функции, прототип функции

9.2. Определение функции

Определение функции состоит из двух частей: заголовка и тела. Заголовок функции дает определение имени функции, типа результата, формальных параметров. Тело функции состоит из оператора (блока), описывающего выполняемые функцией действия. Общий вид определения функции таков:

<тип результата><имя функции>(<список параметров>) { тело}

 где тип результата – допустимый в языке Си тип, имя функции – идентификатор, записанный по правилам язык Си, список параметров – последовательность параметров, разделенных запятыми. Например,

double func(double x, double a, double b)
{ return(a*x+b);
}

Определение функции состоит из объявлений типа функции, ее имени и параметров (все это составляет заголовок функции) и из тела функции (последовательности операторов, реализующих эту функцию). Например, вычисление максимального значения из трех чисел:

int max(int a, int b, int c)
{   int m;
    m=(a > b) ? a:b;
    return((m > c) ? m:c);
}

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

Объявление функции в языке С требует только типа и имени функции и завершается пустыми скобками. Например: int max();

Прототип функции является другим способом объявления функций и требует объявления типа, имени и параметров функций. Например:

int max(int a, int b, int c);.

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

Рассмотрим следующий фрагмент программы:

long lmax(long v1,long v2);
void main()
{
   int limit = 32;
   char ch = 'A';
   long mval;
   mval = lmax(limit, ch);
}

Задан прототип функции для lmax; компилятор будет преобразовывать параметры limit и ch к типу long, используя стандартное правило преобразования, прежде чем они будут помещены в стек для обращения к lmax. При отсутствии прототипа параметры limit и ch были бы помещены в стек соответственно как целое значение и символ; в этом случае в lmax передавались бы параметры, не совпадающие по размеру и содержанию с ожидаемыми. Использование прототипов функций позволяет избежать ошибок.

 В прототипах функций имена параметров могут быть опущены. Например, прототип

void func(int *count, long total);     может быть записан и так:

void func (int * , long);

В обоих случаях функция принимает два параметра: указатель на тип int и целую переменную типа long. Имя параметра используется только в диагностическом сообщении, которое выдается в случае возникновения несоответствия типа параметров.

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

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

char f(long, double, char *);
int a;
f(a, a, a);

 В этом случае первый аргумент a преобразуется к типу long, второй аргумент a к типу double, а при попытке преобразовать третий аргумент a к типу char * будет выдано сообщение об ошибке.

 Прототип функции может заканчиваться многоточием (...), например,

void func (int *count, long total, ...);

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

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

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов