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