Двух множеств объявления функций.



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

Макро определений.

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

Объявление функций

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

Второе множество объявлений функций определяет только тип возврата. Это множество используется только тогда, когда не нужна проверка типов аргументов.

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

char * calloc(); ,

то можно использовать в программе и следующее объявление:

char * calloc (unsigned,unsigned); .

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

Проверка типов аргументов

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

Каждая функция библиотеки Си объявлена в одном или более include-файлах. Для каждой функции приводится два объявления: одно со списком типов аргументов и одно без него. Объявления функций задаются препроцессорным блоком #if define. Ограниченная проверка типов может выполняться только для функций, имеющих переменное число аргументов.

Ограниченная проверка применяется для следующих функций:

1) При вызове функций cprintf, cscanf, printf и scanf проверка типов аргументов выполняется только для первого аргумента, т.е. для аргумента, определяющего формат строки.

2) При вызове функций fprintf, fscanf, sprintf и sscanf проверка типов выполняется только для первых двух аргументов, т.е. для аргумента, определяющего файл или буфер, и аргумента формата строки.

3) При вызове open только два первых аргумента подлежат проверке, т.е. path-имя и флаг открытия.

4) При вызове sopen первые три аргумента подлежат проверке, т.е. path-имя, флаг открытия и распеделенный режим (sharing mode).

5) При вызове execl, execle, execlp и execlpe проверка типов выполняется для первых двух аргументов: для path-имени и первого указателя на аргумент.

6) При вызове spawnl, spawnle, spawnlp и spawnlpe проверка типов выполняется для первых трех аргументов: для флага режима, path-имени и первого указателя на аргумент.

Обработка ошибок

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

Для каждой функции библиотеки Си определено ожидаемое значение возврата. Для некоторых функций ошибочный возврат по некоторым причинам может быть не определенным. Это возникает, например, тогда, когда типы возврата верного значения и ошибочного совпадают. Некоторые функции при возникновении ошибки устанавливают значение типа ошибки в глобальную переменную errno. Заметим, что нельзя установить переменную errno, пока в описании функции эта переменная не будет явно определена.

При использовании функций, устанавливающих errno, можно сверить значение errno со значениями ошибок, определенных в include-файле <errno.h>, или же использовать функции perror и strerror. Если нужно распечатать сообщение о стандартной ошибке - используется perror; если сообщение об ошибке нужно расположить в строке, то используется strerror.

Чтобы убедиться в практической возможности появления ошибки, нужно перед доступом к errno проверить возвращаемое значение.

Если при этом возникла ошибка, то нужно использовать значение errno или функцию perror. Ошибки в математических функциях поддерживаются функцией matherr.

Ошибки в операциях с потоком проверяются функцией ferror.

Функция ferror обнаруживает, установлены ли индикаторы ошибки данного потока. Индикатор ошибки автоматически сбрасывается, если поток закрывается или выбрасывается, или вызывается функция clearerr для обнуления индикатора ошибки. Ошибки в низкоуровневых операциях ввода/вывода требуют установки переменной errno. Проверка конца файла (eof) данного потока осуществляется функцией feof. В низкоуровневых операциях ввода/вывода конец файла обнаруживается при помощи функции eof или когда операция считывания возвращает 0 как число прочитанных байтов.

 

Имена файлов и path-имена

Многие функции в библиотеке Cи допускают строковое представление path-имен и имен файлов как аргументов. Функции обрабатывают аргументы и передают их в операционную систему, которая в свою очередь ответственна за сохранение и создание файлов и директориев. Поэтому важным является выполнение в программах не только Си-соглашений для строк, но и правил ОС для имен файлов и path-имен.

Контрольные вопросы

1. Как осуществляется вызов библиотек СИ?

2. Укажите наиболее важные различия между макро и функцией.

3. Комбинации каких величин содержат include-файлы?

4. Как осуществляется объявление функций?

5. Для каких функций применяется ограниченная проверка?

6. Как осущетсвляется обработка ошибок?

7. В чем заключается основное использование имен файлов и path-имен?

 


Дата добавления: 2019-09-13; просмотров: 199; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!