Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SIT.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
349 Кб
Скачать
☆

Прототипы функций

Особенностью стандарта ANSI языка С является то, что для создания правильного машинного кода функции ему необходимо сообщить до ее первого вызова тип возвращаемого результата, а также количество и типы аргументов. Для этой цели в С используется понятие прототипа функции. Прототип функции задается следующим образом: тип <имя функции>(список параметров);

Использование прототипа функции является объявлением функции (declaration). Чаще всего прототип функции полностью совпадает с заголовком в описании функции, хотя это и не всегда так. При объявлении функции компилятору важно знать имя функции, количество и тип параметров и тип возвращаемого значения. При этом имена формальных параметров функции не играют никакой роли и игнорируются компилятором. Поэтому прототип функции может выглядеть или:

int func(int a, float b. chai* с);

или:

int func(int, float, char*);

Два этих объявления абсолютно равносильны. Рассмотрим пример.

Программа 5.7:

# include <stdio.h>

float sqr(floal a); /* •этo прототип функции, объявление функции */

void main()

{ float b; b= 5.2;

printf( "Квадрат числа %f равен %f", b, sqr(b)); }

f1oal sqr( float a) /* Это описание функции */

{return}a*a; }

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

Программа 5.8:

# include <stdio.h>

/* Неправильный пример*/

int *sqr(int *i) /* Прототип функции */

main()

{int i;

sqr(&x);}

int *sqr(int *i) /* Объявление функции */

{return *i = (*i)*(*i);}

Программа 5.9:

//правильный вариант

# include <stdio.h>

int*-sqr(int* i);

void main ()

{ intx=10, *p;

p=&x;

printf(“address ofx= %p \n", p);

printf(“value in x= %d \n", *p);

p=sqr(р);

printf(“address of sqr(p)= %p \n", p);

printf(" value in sqr(p)= %d \n", *p);

}

int* sqr(int* i)

{

// printf(“address of I= %p \n", i);

*i=((*i)*(*i));

printf(“address of I= %p \n", i);

printf(" value in i^2 = %d \n", *i);

return i;

Результат выполнения программы

address of x=4В07:2256

value in x=10

address of I=4B07:2256

value in i^2=100

address of sqr(p)= 4B07:2256

value in sqr(p)= 100

Программа 5.10:

# include <stdio.h>

/* Неправильный пример*/

int sqr(int *i); /* прототип функции */

main()

{ int x=10);

sqr (&x,10); /* Несоответствие количества аргументов */

{int sqr(int*i)

*i = (*i)*(*i)

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

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

Это должно касаться и функции main(). Ее объявление должно иметь вид void main(void) или main(void).

Программа 5.11:

#include <stdio.h>

void line_ (void); /* прототип функции */

main (void) {

line_ (); }

void line _(void)

for (i=0; i<80;i++)рrintf ("-");

}

Мы уже говорили о стандартных заголовочных файлах (header Files). Заголовочные файлы языка С содержат два типа информации: первый - это отдельные определения, которые используются функциями. Второй - это прототипы функций, относящиеся к этому заголовочному файлу. Примерами таких заголовочных файлов являются файлы sidio.h, string. h. conio.h и др.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]