Определение (описание) функции
Определение или описание функции содержит перечень тех операций, которые будут производится внутри функции.
Схема:
Тип_результата Имя_функции (Тип_пар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, он воспринимает это как команду вставить тело функции в код основной программы без оформления вызова функции. В результате исходный код выглядит логично и не громоздко, а на быстродействии это никак не сказывается.