Выбрать главу

Прототип функции содержит её полное имя с указанием типа возвращаемого значения. Использование прототипов рассмотрим на следующем примере:

    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 нельзя.— Прим. рер. )

Эта директива имеет вид, отличный от формата инструкций С++, поскольку она обрабатывается до компиляции программы. Директива должна располагаться на одной строке и начинаться с символа # в первой позиции строки. Имя файла может быть заключено либо в кавычки, либо в угловые скобки ( последние используются для библиотечных файлов С++ ). Для пользовательских заголовочных файлов применяются кавычки.