Kernighan, B. W. and Ritchie, D. M. "The 'C' Programming Language"; Chapter 19

# 19. Внешние определения.

C-программа представляет собой последовательность внешних определений. Внешнее определение описывает идентификатор как имеющий класс памяти extern (по умолчанию), или возможно static, и специфицированный тип. Спецификатор типа ( п. 17.2) также может быть пустым; в этом случае считается, что тип является типом int. Область действия внешних определений распространяется до конца файла, в котором они приведены, точно так же, как влияние описаний простирается до конца блока. Синтаксис внешних определений не отличается от синтаксиса описаний, за исключением того, что только на этом уровне можно приводить текст функций.

#### Содержание

19.1. Внешнее определение функции.
19.2. Внешние определения данных.

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

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

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

Единственными спецификаторами класса памяти, допускаемыми в качестве спецификаторов-описания, являются extern или static; о различии между ними смотрите п. 20.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 - спецификатор-типа, мах(a,b,c) - описатель-функции, int a,b,c; - список-описаний формальных параметров, { ... } - блок, содержащий текст оператора.

В языке "C" все фактические параметры типа float преобразуются к типу double, так что описания формальных параметров, об'явленных как float, приспособлены прочесть параметры типа double. Аналогично, поскольку ссылка на массив в любом контексте (в частности в фактическом параметре) рассматривается как указатель на первый элемент массива, описания формальных параметров вида "массив ..." приспособлены прочесть: "указатель на ...". И наконец, поскольку структуры, об'единения и функции не могут быть переданы функции, бессмысленно описывать формальный параметр как структуру, об'единение или функцию (указатели на такие об'екты, конечно, допускаются).

## 19.2. Внешние определения данных.

Внешнее определение данных имеет форму

Определение-данных:
  описание

Классом памяти таких данных может быть extern (в частности, по умолчанию) или static, но не auto или register.