Определение функции имеет форму определение-функции: спецификаторы-описания описатель-функциитело-функции необ Единственными спецификаторами класса памяти, допускаемыми вкачестве спецификаторов-описания, являются EXTERN илиSTATIC; о различии между ними смотри п. 19.2. Описатель фун-кции подобен описателю для "функции, возвращающей...", заисключением того, что он перечисляет формальные параметрыопределяемой функции. Оисатель-функции: описатель (список-параметров необ) список параметров: идентификатор идентификатор, список-параметров тело-функции имеет форму тело-функции: список-описаний составной-оператор Идентификаторы из списка параметров и только они могутбыть описаны в списке описаний. Любой идентификатор, тип ко-торого не указан, считается имеющим тип INT. Единственнымдопустимым здесь спецификатором класса памяти являетсяREGISTER; если такой класс памяти специфицирован, то в нача-ле выполнения функции соответствующий фактический параметркопируется, если это возможно, в регистр. Вот простой пример полного определения функции: INT MAX(A, B, C) INT A, B, C; \( INT M; M = (A>B) ? A:B; RETURN((M>C) ? M:C); \) Здесь INT - спецификатор-типа, MAX(A,B,C) - описатель-функ-ции, INT A,B,C; - список-описаний формальных параметров, \(... \) - Блок, содержащий текст оператора. В языке "C" все фактические параметры типа FLOAT преоб-разуются к типу DOUBLE, так что описания формальных парамет-ров, объявленных как FLOAT, приспособлены прочесть параметрытипа DOUBLE. Аналогично, поскольку ссылка на массив в любомконтексте (в частности в фактическом параметре) рассматрива-ется как указатель на первый элемент массива, описания фор-мальных параметров вила "массив ..." приспособлены прочесть: "указатель на ...". И наконец, поскольку структуры,объединения и функции не могут быть переданы функции, бесс-мысленно описывать формальный параметр как структуру,объединение или функцию (указатели на такие объекты, конеч-но, допускаются).