Определение функции имеет форму
определение-функции:
спецификаторы-описания описатель-функции
тело-функции
необ
Единственными спецификаторами класса памяти, допускаемыми в
качестве спецификаторов-описания, являются 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. Аналогично, поскольку ссылка на массив в любом
контексте (в частности в фактическом параметре) рассматрива-
ется как указатель на первый элемент массива, описания фор-
мальных параметров вила "массив ..." приспособлены прочесть
: "указатель на ...". И наконец, поскольку структуры,
объединения и функции не могут быть переданы функции, бесс-
мысленно описывать формальный параметр как структуру,
объединение или функцию (указатели на такие объекты, конеч-
но, допускаются).