Язык С


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


Определение функции имеет форму

определение-функции:

спецификаторы-описания описатель-функции тело-функции необ

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



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