Понятие о функции

Функция языка Си и процедурная абстракция

Как отмечалось ранее, применение абстракции позволяет повысить качество декомпозиции. Язык Си позволяет реализовать один из видов абстракции, который принято называть процедурной абстракцией. Такой вид абстракции основан на применении подпрограмм. В процедурной абстракции используется способ, называемый абстрагированием через параметризацию. Понятие параметров функции знакомо читателю по работе с библиотечными функциями.

Функцией называется автономный фрагмент программного кода, написанный на языке Си, имеющий собственное имя, предназначенный для решения некоторой задачи и возвращающий значение в точку вызова (последнее необязательное). Программной конструкцией для синтаксического оформления указанного фрагмента программного кода служит определение функции.

Прежде всего, отметим, что в языке Си предусмотрены две категории функций:

· Обычные функции.

· Встроенные функции или inline функции (стандарт С99).

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

Рассмотрим компоненты этого определения:

· Имя. Каждая функция должна иметь имя, которое позволяет обратиться к инструкциям, входящих в функцию. Такое обращение называется вызовом функции. Функцию можно вызывать из другой функции.

· Автономность – важнейшая характеристика функции. Язык Си обеспечивает синтаксическую независимость функции от другого программного кода.

· Возвращаемое значение позволяет вернуть результаты вычислений в точку вызова. Следует отметить, что возвращаемое значение является не единственным средством передачи в точку вызова результатов вычислений. Результаты вычислений можно вернуть, с помощью аппарата параметров функции, используя в качестве параметров указатели.

При работе с функциями языка Си следует различать три понятия:

· Определение функции.

· Объявление функции (прототип).

· Вызов функции.

Определение функции является ее реализацией. Написать функцию означает написать ее определение. Каждая функция в программе должна быть представлена только одним определением (это не относится к так называемым встроенным функциям или inline функциям).

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

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

Следует учитывать, что определения функций в соответствии со стандартом языка Си не могут быть вложенными. Правда, некоторые расширения языка (например, вложенные функции реализованы среде rhide)