logo
Харви Дейтел, Пол Дейтел Как программировать на С++ / 02-Deitel-Стр-115-214

3.6. Прототипы функций

Прототип функции является одной из наиболее важных особенностей С++. Прототип функции указывает компилятору тип данных, возвращаемых функцией, количество параметров, которое ожидает функция, тип параметров и ожидаемый порядок их следования. Компилятор использует прототип функ­ции для проверки правильности вызовов функции. Ранние версии С не вы­полняли такого рода проверку, поэтому был возможен неправильный вызов функции без обнаружения ошибок компилятором. Подобные вызовы приво­дили к неисправимым ошибкам выполнения или к хитроумным исправимым логическим ошибкам, которые было очень трудно обнаружить. Прототипы функции устранили этот недостаток.

Замечание по технике программирования 3.9

В С++ требуются прототипы функций. Используйте директиву препроцессора #in­clude, чтобы получить прототипы стандартных библиотечных функций из заголовоч­ных файлов соответствующих библиотек. Используйте также #include для заголо­вочных файлов, содержащих прототипы функций, используемых вами или членами вашей группы.

Прототип функции maximum на рис. 3.4 имеет вид

int maximum(int, int, int);

Этот прототип указывает, что maximum имеет три аргумента типа int и возвращает результат типа int. Заметим, что прототип функции такой же, как заголовок описания функции maximum, за исключением того, что в него не включены имена параметров (x, у и z).

Хороший стиль программирования 3.7

Имена параметров могут быть включены в прототипы функции с целью документи­рования. Компилятор эти имена игнорирует.

Типичная ошибка программирования 3.9

Отсутствие точки с запятой в конце прототипа функции является синтаксической ошибкой.

Вызов функции, который не соответствует прототипу функции, ведет к синтаксической ошибке. Синтаксическая ошибка возникает также в случае отсутствия согласования между прототипом и описанием функции. Напри­мер, если бы в программе на рис. 3.4 прототип функции был бы написан так:

void maximum(int, int, int);

компилятор сообщил бы об ошибке, потому что возвращаемый тип void в прототипе функции отличался бы от возвращаемого типа int в заголовке функции.

Другой важной особенностью прототипов функций является приведение типов аргументов, т.е. задание аргументам подходящего типа. Например,