Содержание | <<< | >>>

Заголовки

С каждой функцией стандартной библиотеки С связан свой заголовок. Соответствующие заголовки используемых функций должны быть включены в программу с помощью директивы #include. Заголовки выполняют две важные функции. Во-первых, многие функции стандартной библиотеки работают с данными собственного определенного типа, к которым должна иметь доступ основная программа, использующая эти функции. Эти типы данных задаются в заголовках, связанных с каждой функцией. Одним из наиболее распространенных примеров является заголовок файловой системы <stdio.h>, определяющий тип FILE, который необходим для выполнения операций с файлами на диске.

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

Список стандартных заголовков, определенных Стандартом С89, приведен в таблице 12.1. В таблице 12.2 приведены заголовки, добавленные в Стандарте С99.

Стандартом С для заголовков зарезервированы идентификаторы, начинающиеся символом подчеркивания, за которым следует символ подчеркивания либо заглавная буква.

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

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

Таблица 12.1. Заголовки, определенные в С89
ЗаголовокНазначение
<assert.h>Определяет макрос assert()
<ctype.h>Обработка символов
<errno.h>Выдача сообщения об ошибках
<float.h>Задает пределы значений с плавающей точкой, зависящие от реализации
<limits.h>Задает различные ограничения, зависящие от реализации
<locate.h>Поддерживает локализацию
<math.h>Различные определения, используемые математической библиотекой
<setjmp.h>Поддерживает нелокальные переходы
<signal.h>Поддерживает обработку сигналов
<stdarg.h>Поддерживает списки входных параметров функции с переменным числом аргументов
<stddef.h>Определяет некоторые наиболее часто используемые константы
<stdio.h>Поддерживает систему ввода/вывода
<stdlib.h>Смешанные объявления
<string.h>Поддерживает функции обработки строк
<time.h>Поддерживает функции, обращающиеся к системному времени

Таблица 12.2. Заголовки, добавленные в С99
ЗаголовокНазначение
<complex.h>Поддерживает арифметические операции с комплексными числами
<fenv.h>Предоставляет доступ к флажкам состояния вычислителя, выполняющего операции с плавающей точкой, а также доступ к другим сигналам этого вычислителя
<inttypes.h>Определяет стандартный, переносимый набор имен целочисленных типов, поддерживает функции, которые работают с целыми значениями наибольшей разрядности
<iso646.h>Добавлено в 1995 году Поправкой 1; определяет макросы, соответствующие различным операторам, например && и ^
<stdbool.h>Поддерживает логические типы данных; определяет макрос bool, способствующий совместимости с языком C++
<stdint.h>Задает стандартный переносимый набор имен целочисленных типов; этот файл включен в заголовок <inttypes.h>
<tgmath.h>Определяет макросы для родового (абстрактного) типа чисел с плавающей точкой
<wchar.h>Добавлен в 1995 году Поправкой 1; поддерживает функции обработки многобайтовых слов и двухбайтовых символов
<wctype.h>Добавлен в 1995 году Поправкой 1; поддерживает функции классификации многобайтовых слов и двухбайтовых символов

Макросы в заголовках

Многие стандартные функции С можно ввести либо как собственно функции, либо как подобные функциям макросы, заданные в заголовке. Например, функцию abs(), которая возвращает абсолютную величину целочисленного аргумента, можно также задать как макрос:

#define abs(i)  (i)<0 ? -(i):(i)

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

Чтобы компилятор использовал истинную функцию, необходимо предпринять меры против подстановки им макроса на место имени функции. Для этого есть несколько способов, но, безусловно, лучший из них — просто пометить имя макроса как неопределенное с помощью #undef. Например, чтобы заставить компилятор подставить вместо ранее определенного макроса истинную функцию abs(), можно в начало программы вставить следующую строку:

#undef abs

Теперь, когда abs больше не является макросом, будет использоваться функция.


Содержание | <<< | >>>