Параметры
Аргументы — это имена значений, переданных в функцию в результате вызова функции. Параметры — это значения, которые ожидает получить функция. В прототипе функции в круглых скобках после имени функции содержится полный список параметров функции и их типов. Объявления параметров определяют типы, размеры и идентификаторы значений, хранящихся в параметрах.
Синтаксис
function-definition
:
declaration-specifiers
необ. attribute-seq
необ. declarator
declaration-list
необ. compound-statement
/* attribute-seq
используется только в системах Майкрософт */
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
необ.
parameter-type-list
содержит последовательность объявлений параметров, разделенных запятыми. Форма каждого параметра в списке параметров выглядит следующим образом.
register
необ.type-specifier
declarator
необ.
Параметры функции, объявленные с атрибутом auto
, создают ошибки. Идентификаторы параметров используются в теле функции для ссылки на значения, переданные в функцию. Параметрам можно присвоить имена в прототипе, но имена выходят за пределы области в конце объявления. Поэтому имена параметров можно присвоить таким же образом или по-другому в определении функции. Эти идентификаторы невозможно переопределить в крайнем блоке тела функции, но их можно переопределить во внутренних вложенных блоках, как если бы список параметров был внешним блоком.
Каждому идентификатору в parameter-type-list
должен предшествовать соответствующий описатель типа, как показано в следующем примере:
void new( double x, double y, double z )
{
/* Function body here */
}
Если в списке имеется хотя бы один параметр, то список может заканчиваться запятой и тремя точками (, ...
). Эта конструкция, называемая нотацией с многоточием, указывает переменное число аргументов функции. (Дополнительные сведения см. в разделе Вызовы с переменным числом аргументов.) Однако вызов функции должен иметь по крайней мере столько аргументов, сколько есть параметры до последней запятой.
Если аргументы не требуется передавать в функцию, список параметров заменяется ключевым словом void
. В данном случае использование ключевого слова void
отличается от его использования в качестве описателя типа.
Порядок и тип параметров, включая любое использование нотации с многоточием, должны быть одинаковыми во всех объявлениях функций (если есть) и в определении функции. Типы аргументов после обычных арифметических преобразований должны быть совместимы по назначению с типами соответствующих параметров. (См. раздел Обычные арифметические преобразования для получения сведений об арифметических преобразованиях.) Аргументы после многоточия не проверяются. Параметр может иметь любой основной тип, тип структуры, объединения, указателя или массива.
Компилятор выполняет обычные арифметические преобразования отдельно для каждого параметра и для каждого аргумента при необходимости. После преобразования параметры имеют длину не менее int
и никогда не имеют типа float
, если для конкретного параметра в прототипе явно не задан тип float
. Это означает, например, что объявление параметра как char
будет иметь тот же эффект, что и его объявление как int
.