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