C-программа представляет собой последовательность внешних определений. Внешнее определение описывает идентификатор как имеющий класс памяти extern (по умолчанию), или возможно static, и специфицированный тип. Спецификатор типа ( п. 17.2) также может быть пустым; в этом случае считается, что тип является типом int. Область действия внешних определений распространяется до конца файла, в котором они приведены, точно так же, как влияние описаний простирается до конца блока. Синтаксис внешних определений не отличается от синтаксиса описаний, за исключением того, что только на этом уровне можно приводить текст функций.
Определение функции имеет форму
Тело-функции имеет форму
Идентификаторы из списка параметров и только они могут быть описаны в списке описаний. Любой идентификатор, тип которого не указан, считается имеющим тип 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. Аналогично, поскольку ссылка на массив в любом контексте (в частности в фактическом параметре) рассматривается как указатель на первый элемент массива, описания формальных параметров вида "массив ..." приспособлены прочесть: "указатель на ...". И наконец, поскольку структуры, об'единения и функции не могут быть переданы функции, бессмысленно описывать формальный параметр как структуру, об'единение или функцию (указатели на такие об'екты, конечно, допускаются).
Внешнее определение данных имеет форму
Классом памяти таких данных может быть extern (в частности, по умолчанию) или static, но не auto или register.