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