Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Основы программирования на C++.doc
Скачиваний:
148
Добавлен:
02.05.2014
Размер:
872.96 Кб
Скачать

Об"явление функций

Синтаксис:

[<type-specifier>]<declarator>([<arg-type-list>])[,<declarator>...];

Об"явление функции определяет имя, тип возврата функции и, возможно, типы и число ее аргументов. Об"явление функции также называется forward- об"явлением. Декларатор функции об"являет имя функции, а спецификатор типа задает тип возврата. Если специфика­тор типа опущен в об"явлении функции, то предполагается, что функция возвращает величину типа int.

Об"явление функции может включать спецификаторы класса па­мяти extern или static.

Список типов аргументов.

Список типов аргументов- <arg-type-list> определяет число и типы аргументов функции. Синтаксис списка аргументов следующий:

<type-name-list>[,...]

Список имен типов- это список из одного или более имен ти­пов. Каждое имя типа отделяется от другого запятой. Первое имя типа задает тип первого аргумента, второе имя типа задает тип второго аргумента и т. д. Если список имен типов заканчивается запятой с многоточием (,...), то это означает, что число аргумен­тов функции переменно. Однако, предполагается, что функция будет иметь не меньше аргументов, чем имен типов, предшествующих много­точию.

Если список типов аргументов- <arg-type-list> содержит

только многоточие (...), то число аргументов функции является пе-

ременным или равно нулю.

Замечание:

Чтобы поддержать совместимость с программами предидущих версий, компилятор допускает символ запятой без многоточия в кон­це списка типов аргументов для обозначения их переменного числа. Запятая может быть использована и вместо многоточия для об"явле­ния нуля или более аргументов функции. Использование запятой под­держивается только для совместимости. Использование многоточия рекомендуется для нового представления.

Имя типа- <type- name> для типов структуры, совмещения или базового типа состоит из спецификатора этого типа (такого как int ). Имена типов для указателей, массивов и функций формируются пу­тем комбинации спецификатора типа с "абстрактным декларатором". Абстрактный декларатор- это декларатор без идентификатора. В раз­деле 4.9 "Имена типов" об"ясняется, каким об"разом формировать и интерпретировать абстрактные деклараторы.

Для того чтобы об"явить функцию, не имеющую аргументов, мо­жет быть использовано специальное ключевое слово void на месте списка типов аргументов. Компилятор вырабатывает предупреждающее сообщение, если в вызове такой функции будут специфицированы ар­гументы.

Еще одна специальная конструкция допускается в списке типов аргументов. Это фраза void *, которая специфицирует аргумент типа указатель. Эта фраза может быть использована в списке типов аргу­ментов вместо имени типа.

Список типов аргументов может быть опущен. В зтом случае скобки после идентификатора функции все же требуются, хотя они и пусты. В этом случае в об"явлении функции не определяются ни ти­пы, ни число аргументов в функции. Когда эта информация опускает-

ся, то компилятор не проверяет соответствия между формальными и фактическими параметрами при вызове функции. Более подробная ин­формация дана в разделе 7.4 "Вызовы функций".

Тип возврата

Функции могут возвращать величины любого типа за исключени­ем массивов и функций. Для этого посредством спецификатора типа­"type-specifier" в об"явлении функции можно специфицировать любой тип: основной, структуру или совмещение. Идентификатор функции может быть модифицирован одной или несколькими звездочками (*), чтобы об"явить возвращаемую величину типа указателя.

Хотя функции и не допускают возвратов массивов или функций, но они могут возвращать указатели на массивы или функции. Функ­ции, которые возвращают указатели на величины типа массив или функция, об"являются посредством модификации идентификатора функ­ции квадратными скобками, звездочкой и круглыми скобками, чтобы сформировать составной декларатор. Формирование и интерпретация составных деклараторов рассматривались в разделе 4.3.2.

Примеры:

int add(int, int); /* Example 1 */

double calc(); /* Example 2 */

char *strfind(char *,...); /* Example 3 */

void draf(void); /* Example 4 */

double (*sum(double, double)) [3]; /* Example 5 */ int (*select(void)) (int) ; /* Example 6 */

char *p; /* Example 7 */

short *q;

int prt(void *);

В первом примере об"является функция, поименованная add, которая требует два аргумента типа int и возвращает величину типа int.

Во втором примере об"является функция, поименованная calc, которая возвращает величину типа double. Список типов аргументов не задан. В третьем примере об"является функция, поименованная strfind, которая возвращает указатель на величину типа char. Фун­кция требует, по крайней мере один аргументуказатель на величину типа char. Список типов аргументов заканчивается запятой с много­точием, обозначающим, что функция может потребовать большее число аргументов.

В четвертом примере об"является функция с типом возврата void (нет возвращаемой величины). Список типов аргументов также void, означающий отсутствие аргументов для этой функции.

В пятом примере sum об"является как функция, возвращающая указатель на массив из трех величин типа double. Функция sum тре­бует два аргумента, каждый из которых является величиной типа double.

В шестом примере функция, поименованная select, об"явлена без аргументов и возвращает указатель на функцию. Указатель возв­рата ссылается на функцию, требующую один аргумент типа int и возвращающую величину типа int.

В седьмом примере об"явлена функция prt, которая требует аргумент- указатель любого типа, и которая возвращает величину типа int. Любой указатель p или q могли бы быть использованы как аргументы функции без выдачи при этом предупреждающего сообщения.