Операционная система UNIX. Руководство программиста

     

Внешние определения функций


Определения функций имеют вид:

определение_функции: спецификаторы описатель_функции тело_функции

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



Содержание раздела