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) - описатель-функции, inta,b,c; - список-описаний формальных параметров, { ... } - блок,содержащий текст оператора.

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


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

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

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

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