Текст после препроцессора
-
……….
if (r>0.0)/* Сравнение с константой ZERO * / /* Длина окружности радиуса r: * / D=2*3.141593*r;
……….
Рис. 1.1. Обработка текста программы препроцессором
Имена РI и ZERO (см. рис. 1.1) после работы препроцессора заменены в тексте программы на определенные в двух директивах #define значения (3.141593 и 0.0).
Обратите внимание, что подстановка не выполняется в комментариях и в строковых константах. В примере на рис. 1.1 идентификатор ZERO остался без изменений в комментарии (/* Сравнение с константой ZERO */).
Именно с помощью набора именованных препроцессорных констант стандарт языка Си рекомендует авторам компиляторов определять предельные значения всех основных типов данных. Для этого в языке определен набор фиксированных имен, каждое из которых является именем одной из констант, определяющих то или иное предельное значение. Например:
FLT _МАХ - максимальное число с плавающей точкой типа f1oat;
CНAR_BIT - количество битов в байте;
Int_min - минимальное значение для данных типа int.
Чтобы использовать в программе указанные именованные препроцессорные константы, недостаточно записать их имена в программе. Предварительно в текст программы необходимо включить препроцессорную директиву такого вида:
#include <имя _заголовочного_файла>
где в качестве имени_заголовочного_файла подставляются:
limits.h - для данных целых типов;
f1oat.h - для вещественных данных.
В заголовочный файл limits.h авторы компилятора поместили набор препроцессорных директив, среди которых есть такие:
#define CНAR_BIT 8
#define SНRT_МАХ 0x7FFF
#define LONG_МАХ Ox7FFFFFFFL
В заголовочном файле float.h находятся директивы, определяющие константы, связанные с представлением данных вещественных типов. Например:
#define FLT_МIN 1.17549435E-38F
#define DBL_МIN2.2250738585072014Е-308
#define DBL_EPSILON 2.22044БО492503131Е- l6
Значения этих предопределенных на препроцессорном уровне констант в соответствии со стандартом языка в конкретных компиляторах могут быть несколько иными. Подробно о возможностях препроцессорных средств будет говориться далее. Сейчас достаточно знать, что, записав в тексте своей программы директиву
#include <limits.h>
можно использовать в программе стандартные именованные константы CНAR_ВIT, SНRT_МIN и т.д., а уж их значениями - будут те числа, которые включили в директивы #define авторы конкретного компилятора и конкретной библиотеки.
Если включить в программу директиву
#include <float.h>
то станут доступными именованные константы предельных значений числовых данных вещественных типов.
Такой подход к определению предельных значений с помощью препроцессорных констант, сохраняемых в библиотечных файлах; позволяет писать программы, не зависящие от реализации, что обеспечивает их достаточную мобильность. Программист использует в программе стандартные имена (обозначения) констант, а их значения определяются версией реализации, т.е. конкретным компилятором и его библиотеками.