- •Понятие алгоритма и программы. Этапы решения задач на эвм. Способы представления алгоритмов. Базовые структуры алгоритмов. Примеры.
- •6. Анализ результатов решения задачи и уточнение в случае необходимости математической модели с повторным выполнением этапов 2-5.
- •Операторы передачи управления. Составной и пустой операторы. Примеры ветвящихся алгоритмов и программ.
- •Понятие указателя, описание и инициализация указателей. Операции над указателями. Выражения с указателями. Примеры.
- •Массивы и их описание. Инициализация и ввод-вывод массивов. Примеры обработки массивов.
- •Модульный принцип программирования. Описание, структура функции и ее вызов. Примеры
- •Блочная структура программного модуля. Классы хранения (памяти) объектов программы. Примеры.
- •8.4. Объявления функций
- •Понятие файла (потока). Создание и режимы доступа к файлу, его закрытие. Примеры.
- •Тип структуры и структурные переменные, их описание и инициализация. Примеры.
- •Динамические структуры данных. Примеры.
8.4. Объявления функций
Функции всегда определяются на внешнем уровне, т. е. глобально. Объявления функций (прототипы) могут находиться как на глобальном, так и на локальном уровнях.
Функции могут быть объявлены с классом памяти static или extern.
Правила определения области видимости для функций отличаются от правил видимости для переменных и состоят в следующем:
· функция, объявленная как static, видима в пределах того файла, в котором она определена. Каждая функция может вызвать другую функцию с классом памяти static из своего исходного файла, но не может вызвать функцию, функция, объявленная как static, видима в пределах того файла, в определенную с классом static в другом исходном файле. Разные функции с классом памяти static, имеющие одинаковые имена, могут быть определены в разных исходных файлах, и это не ведет к конфликту;
· функция, объявленная с классом памяти extern, видима в пределах всех исходных файлов программы. Любая функция может вызывать функции с классом памяти extern;
· если в объявлении функции отсутствует спецификатор класса памяти, то по умолчанию принимается класс extern.
Все объекты с классом памяти extern компилятор помещает в объектном файле в специальную таблицу внешних ссылок, которая используется редактором связей для разрешения внешних ссылок. Часть внешних ссылок порождается компилятором при обращениях к библиотечным функциям C, поэтому для разрешения этих ссылок редактору связей должны быть доступны соответствующие библиотеки функций.
Рассмотрим пример, состоящий из трех файлов исходного текста программы, образующих проект:
1.cpp
#include "fn.h"
int B()
{
return 10;
}
static int C()
{
return 15;
}
fn.h
int B();
int C();
fn.cpp
#include <stdio.h>
#include "fn.h"
int main()
{
int A=B()+C();
printf("%d\n",A);
return 0;
}
При компиляции проекта появится сообщение об ошибке: неизвестный символ C() в файле last.cpp. Причина такой ошибки в том, что функция C() – статическая и не может быть вызвана из другого модуля проекта.
Подробнее о способах разработки программ на основе проектов будет рассказано далее.
Время жизни объектов программы определяется по следующим правилам:
· переменная, объявленная глобально, т. е. вне всех блоков, существует на протяжении всего времени выполнения программы;
· локальные переменные, т. е. объявленные внутри блока, а также переменные с классом памяти register или auto, имеют время жизни только на период выполнения того блока, в котором они объявлены. Если переменная объявлена внутри блока с классом памяти static или extern, то она имеет время жизни на период выполнения всей программы;
Видимость переменных и функций в программе определяется следующими правилами:
· переменная, объявленная или определенная глобально, видима от точки объявления или определения до конца исходного файла. Можно сделать переменную видимой и в других исходных файлах, для чего в этих файлах следует ее объявить с классом памяти extern;
· переменная, объявленная или определенная локально, видима от точки объявления или определения до конца текущего блока;
· переменные из объемлющих блоков, включая переменные, объявленные на глобальном уровне, видимы во внутренних блоках. Эту видимость называют вложенной. Если переменная, объявленная внутри блока, имеет то же имя, что и переменная, объявленная в объемлющем блоке, то это разные переменные, и переменная из объемлющего блока во внутреннем блоке будет невидимой;
· функции с классом памяти static видимы только в том файле, в котором они определены. Остальные функции видимы во всей программе;
· метки в функции видимы в пределах данной функции;
· имена формальных параметров, объявленные в списке параметров прототипа функции, видимы только от точки объявления параметра до конца объявления функции.