Определения функций в C
Определение функции задает имя функции, типы и число ожидаемых параметров, а также тип значений, возвращаемый функцией. Определение функции также содержит тело функции с объявлениями ее локальных переменных и операторы, которые определяют действия, выполняемые функцией.
Синтаксис
translation-unit
:
external-declaration
translation-unit
external-declaration
external-declaration
: /* Разрешено только во внешней области (файла) */
function-definition
declaration
function-definition
:
declaration-specifiers
необ. attribute-seq
необ. declarator
declaration-list
необ. compound-statement
/* attribute-seq
используется только в системах Майкрософт */
Параметры прототипа:
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
необ.
type-specifier
declaration-specifiers
необ.
type-qualifier
declaration-specifiers
необ.
declaration-list
:
declaration
declaration-list
declaration
declarator
:
pointer
необ. direct-declarator
direct-declarator
: /* Оператор объявления функции */
direct-declarator
(
parameter-type-list
)
/* Декларатор нового стиля */
direct-declarator
(
identifier-list
opt )
/* Устаревший декларатор */
Для списка параметров в определении используется следующий синтаксис:
parameter-type-list
: /* Список параметров */
parameter-list
parameter-list
, ...
parameter-list
:
parameter-declaration
parameter-list
,
parameter-declaration
parameter-declaration
:
declaration-specifiers
declarator
declaration-specifiers
abstract-declarator
необ.
В определении функции устаревшего стиле для списка параметров используется следующий синтаксис:
identifier-list
: /* Используется в определениях и объявлениях функций устаревшего стиля */
identifier
identifier-list
,
identifier
Синтаксис тела функции:
compound-statement
:
{
declaration-list
необ. statement-list
необ. }
Изменять объявления функций могут только описатели класса хранения extern
и static
. Описатель extern
означает, что на функцию можно ссылаться из других файлов; то есть, имя функции экспортируется в компоновщик. Описатель static
означает, что функция не может ссылаться из других файлов. То есть имя не экспортируется компоновщиком. Если в определении функции класс хранения не указан, принимается класс extern
. В любом случае функция всегда видна от точки определения до конца файла.
Необязательный declaration-specifiers
и обязательный declarator
вместе указывают возвращаемый тип и имя функции. Декларатор declarator
представляет собой сочетание идентификатора, задающего имя функции, и круглых скобок после имени функции. Необязательный attribute-seq
нетерминальный — это функция, определенная корпорацией Майкрософт в атрибутах функций.
( direct-declarator
в синтаксисе declarator
) указывает имя определяемой функции и идентификаторы его параметров. Если он direct-declarator
содержит parameter-type-list
, список указывает типы всех параметров. Такой декларатор также является прототипом функции для ее последующих вызовов.
В declaration
определениях функций не может содержаться другое storage-class-specifier
register
.declaration-list
В type-specifier
синтаксисе declaration-specifiers
можно исключить только в том случае, если register
для значения int
типа указан класс хранилища.
Это compound-statement
тело функции, содержащее объявления локальных переменных, ссылки на внешние объявленные элементы и инструкции.
Компоненты определения функции подробно рассматриваются в статьях Атрибуты функций, Класс хранения, Тип возвращаемого значения, Параметры и Текст функции.