C++.Бархатный путь


Функция. Прототип - часть 2


Каждая функция, перед тем, как она будет вызвана, по крайней мере, должна быть объявлена. Это обязательное условие успешной трансляции и вольный перевод соответствующего сообщения об ошибке (Call to undefined function 'ИмяФункции'), выдаваемого транслятором в случае вызова необъявленной функции.

Напомним, что объявление и определение - разные вещи. Объект может быть много раз объявлен, но только один раз определён. Прототип функции при этом играет роль объявления функции. В объявлении функции сосредоточена вся необходимая транслятору информация о функции - о списке её параметров и типе возвращаемого значения. И это всё, что в момент трансляции вызова необходимо транслятору для осуществления контроля над типами. Несоответствия типов параметров в прототипе и определении функции выявляются на стадии окончательной сборки программы. Несоответствие спецификации возвращаемого значения в объявлении прототипа и определении функции также является ошибкой. #include <iostream.h> void ZZ(int ppp); /* Эта строка требуется для нормальной компиляции программы. Это и есть прототип функции. Имя параметра в объявлении может не совпадать с именем параметра в определении. */ void main (void) { ZZ(125); } void ZZ(int par1) { cout << "This is ZZ " << par1 << endl; }

Самое интересное, что и такое объявление не вызывает возражений транслятора. #include <iostream.h> void ZZ(int); /* Отсутствует имя параметра. Можно предположить, что имя параметра не является обязательным условием правильной компиляции. */ void main (void) { ZZ(125); } void ZZ(int par1) { cout << "This is ZZ " << par1 << endl; }

Правила грамматики подтверждают это предположение. Ранее соответствующее множество БНФ уже рассматривалось: ОбъявлениеПараметра ::= СписокСпецификаторовОбъявления Описатель

::= СписокСпецификаторовОбъявления

Описатель

Инициализатор

::= СписокСпецификаторовОбъявления

[АбстрактныйОписатель] [Инициализатор]

Из этой формы Бэкуса-Наура следует, что объявление параметра может состоять из одного спецификатора объявления (частный случай списка спецификаторов). Так что имени параметра в списке объявления параметров в прототипе функции отводится в букальном смысле роль украшения. Его основное назначение в прототипе - обеспечение легкочитаемости текста программы. Принципиальное значение имеет соответствие типов параметров в определении и объявлении функции.

Попытка трансляции следующего примера программы оказывается неудачной. #include <iostream.h> void ZZ(float);// Другой тип параметра. void main (void) { ZZ(125); } void ZZ(int par1) { cout << "This is ZZ " << par1 << endl; }

Если функция не возвращает значения, в объявлении и определении обязательно используется спецификатор объявления void.

Функция также может не иметь параметров. В этом случае объявление параметров в определении и прототипе может быть либо пустым, либо может состоять из одного ключевого слова void. В контексте объявления параметров слово void и пустой список спецификаторов параметров эквивалентны.

| |

 




- Начало -  - Назад -  - Вперед -