Прототип функции содержит её полное имя с указанием типа возвращаемого значения. Использование прототипов рассмотрим на следующем примере:
int someFunc( double , int ) ;
int main( int argc , char* pArgs[ ] )
{
someFunc( 1 , 2 ) ;
}
int someFunc( double arg1 , int arg2 )
{
/* ...выполнение каких-то действий */
}
Использованный прототип объясняет миру ( по крайней мере той его части, которая следует после этого объявления ), что полным именем функции someFunc( ) является someFunc( double , int ). Теперь при её вызове в main( ) компилятор поймёт, что 1 нужно преобразовать к типу double. Кроме того, функция main( ) осведомлена, что someFunc( ) возвращает целое значение.
►Хранение переменных в памяти...90
Переменные функции хранятся в трёх разных местах. Переменные, объявленные внутри функции, называются локальными. В следующем примере переменная localVariable является локальной по отношению к функции fn( ):
int globalVariable ;
void fn( )
{
int localVariable ;
static int staticVariable ;
}
До вызова fn( ) переменной localVariable не существует. После окончания работы функции она оставляет этот бренный мир и её содержимое навсегда теряется. Добавлю, что доступ к ней имеет только функция fn( ), остальные использовать её не могут.
А вот переменная globalVariable существует на протяжении работы всей программы и в любой момент доступна всем функциям.
Статическая переменная staticVariable является чем-то средним между локальной и глобальной переменными. Она создаётся, когда программа при выполнении достигает описания переменной ( грубо говоря, когда происходит первый вызов функции ). К тому же staticVariable доступна только из функции fn( ). Но, в отличие от localVariable, переменная staticVariable продолжает существовать и после окончания работы функции. Если в функции fn( ) переменной staticVariable присваивается какое-то значение, то оно сохранится до следующего вызова fn( ).
________________
12Более того, как вы узнаете позже, тела функции в данном модуле может и не оказаться. — Прим. ред.
_________________
90 стр. Часть 2. Становимся функциональными программистами
►Использование заголовочных файлов...91
Обычно прототипы функций помещаются в отдельный файл ( называемый включаемым, или заголовочным ), который программист затем включает в исходный файл С++. При компиляции препроцессор С++ ( который выполняется до стадии компиляции программы ) вставляет содержимое такого файла в программу в том месте, где встречает соответствующую директиву #include"filename".
Вот как может выглядеть простой заголовочный файл с определением математических функций с именем math:
/* Заголовочный файл math содержит прототипы функций, которые могут использоваться несколькими программами. */
/* Функция abs возвращает абсолютное значение аргумента */
double abs( double d ) ;
/* Функция square возвращает квадрат аргумента */
double square( double d ) ;
Программа использует заголовочный файл math следующим образом:
/* Программа с математическими вычислениями */
#include "math"
using namespace std ;
// Код программы
Директива #include требует от препроцессора заменить её содержимым указанного в ней файла.( Между # и include можно ставить пробел, а вот между < и iostream нельзя.— Прим. рер. )
Эта директива имеет вид, отличный от формата инструкций С++, поскольку она обрабатывается до компиляции программы. Директива должна располагаться на одной строке и начинаться с символа # в первой позиции строки. Имя файла может быть заключено либо в кавычки, либо в угловые скобки ( последние используются для библиотечных файлов С++ ). Для пользовательских заголовочных файлов применяются кавычки.