Примеры определения функции

Все функции в программе существуют на глобальном уровне и не могут быть вложены друг в друга.

Объявление и определение функции

Объявление typedef

Объявление, начинающееся с ключевого слова typedef, вводит новое имя для типа, не для переменной данного типа. Целью такого объявления часто является назначение короткого синонима для часто используемого типа. Например, при частом применении unsigned charможно ввести синоним uchar.

typedef unsigned char uchar; // Теперь uchar – синоним для unsigned char

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

Объявление функции задаёт имя функции, тип возвращаемого значения и количество и типы параметров, которые должны присутствовать при вызове функции. Указание void в качестве возвращаемого значения означает, что функция не возвращает значения.

Определением функции является объявление функции, в котором присутствует тело функции. Определение функции имеет следующий синтаксис:

<тип> <имя> (<список формальных параметров>)

{

[<объявления>]

[<операторы>]

}

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

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

double Cube(double x) { return x * x * x; }   // Функция одного вещественного аргумента, которая возвращает вещественное значение, // равное кубу аргумента
void main() { printf("Hello!\n"); } // Главная функция программы, которая печатает строку "Hello!" на экране

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

Функция должна возвращать значение, если она не объявлена как void. И наоборот – значение не может быть возвращено из функции, если она объявлена как void. Как и передача параметров, семантика возврата значения из функции идентична семантике инициализации. Возвращаемое значение задаётся инструкцией return.

int f1() { } void f2() { } // Ошибка – не возвращается значение // Правильно
int f3() { return 1; } void f4() { return 1; } // Правильно // Ошибка – значение возвращается в функции void
int f5() { return; } void f6() { return; } // Ошибка – не указано возвращаемое значение // Правильно

Функция с типом void не может возвращать значение. Однако вызов функции с типом void не даёт значения, так что функция с типомvoid может использовать вызов функции с типом void как выражение в инструкции return.

void g() { ... }   void h() { return g(); }     // Правильно

Такая форма инструкции return важна при написании шаблонов функций, когда тип возвращаемого значения является параметром шаблона.