Определение (описание) функции

Определение или описание функции содержит перечень тех операций, которые будут производится внутри функции.

Схема:

Тип_результата Имя_функции (Тип_пар1 Имя_пар1, Тип_пар2 Имя_пар2, ...) { Оператор1; Оператор2; ... ОператорN; return n;};
  • Имя_парN — уникальное внутри функции имя N-ro параметра. Имена параметров можно задавать и в прототипе функции, тогда в определении надо использовать те же имена.
  • ОператорN — некоторые операторы и выражения, содержащиеся внутри функции и выполняющиеся каждый раз при вызове функции. Внутри операторов мы можем обращаться к глобальным объектам программы; к локальным объектам, объявленным внутри функции; а также к аргументам функции.
  • return n — оператор, останавливающий работу функции и возвращающий n в качестве её значения (при этом тип n должен соответствовать типу результата в объявлении функции). Наличие этого оператора обязательно для функции возвращающей значение. Для функции объявленной как void можно вызывать оператор return без аргументов, это досрочно завершит функцию, иначе — будут выполнены все действия до конца блока описания функции.

Блок определения функции называется также её телом.

Одна функция не может объявляться или определяться внутри другой (т.е. нельзя объявлять и определять функции внутри main).

Пример объявления и описания функции:

int max (int, int);int max (int n1,int n2) { if(nl > n2) { return n1; } else { return n2; }} int main(void) { int а = 100 - max(10,20); cout << a; return 0;}

Видно, что вся информация, имевшаяся в прототипе функции, повторяется в её определении, поэтому если функция определена до её первого вызова, то отдельно прототип указывать не обязательно.

Пример:

double cube (double a) { return a*a*a;} int main(void) { double pi = 3.1415; cout << cube(pi); return 0;}

Но отдельно прототип указывают в тех случаях, когда функция будет описываться позже своего использования. Например, можно было объявить функцию до main, вызвать её из main, но описать только после main.

Пример:

double cube (double);int main(void) { double pi = 3.1415; cout << cube(pi); return 0;} double cube (double a) { return a*a*a;}

Типы функций

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

Библиотеки подключается при помощи директивы препроцессора #include. После директивы препроцессора указывается имя библиотеки или имя заголовочного файла библиотеки. Имя заключается в угловые скобки (для стандартных библиотек) или в двойные кавычки (для остальных библиотек).

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

#include "math.h"

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

Встраиваемые функции

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

Встраиваемая функция описывается точно также, как и обычная, но ее заголовок предваряется служебным словом inline:

inline int swap(int a, int b){ a = a+b; b = a-b; a = a-b;}

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