Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_С++_последная.doc
Скачиваний:
40
Добавлен:
07.05.2019
Размер:
876.54 Кб
Скачать

1.6. Директивы препроцессора

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

Все другие средства: математические вычисления, работа со строками, ввод/вывод, работа с файлами – были оформлены в виде функций и помещены в библиотеки.

В 1989 году появился стандарт языка С (ANSI C). Этот документ определил, какие библиотеки следует считать стандартными и включать в любой пакет разработчика. Стандартные библиотеки обеспечивают доступ к важнейшим системным функциям, минуя системозависимые аспекты. Так, например, математическая функция sin () вычисляет синус вещественного числа, скрывая от пользователя особенности работы конкретного процессора.

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

Основные стандартные библиотеки С/С++ приведены в табл. 1.

Таблица 1

Основные стандартные библиотеки С/С++

Название

Назначение и содержание

1

2

math.h

математические функции.

ctype.h

библиотека символьных функций

string.h

библиотека строковых функций

iostream.h

операторы стандартного ввода/вывода

stdio.h

функции стандартного ввода/вывода

stdlib.h

библиотека функций для работы с динамической памятью

alloc.h

работа со случайными числами, преобразования типов

conio.h

работа с терминалом

time.h

библиотека предназначена для работы со временем и датой

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

Директивы препроцессора, по сути, не являются составной частью языка С, а используются для подстановки кода в текст программы. Препроцессор – это особая программа, которая выполняет предварительную обработку данных до начала компиляции. Рассмотрим стандартные директивы препроцессора.

Директива #include. Директива #include, которая используется фактически во всех программах для включения в текст программы заголовочных файлов (с определениями), имеющий расширение .h, или файлов .с (не содержащих функцию main ()).

Эта директива может использоваться в двух формах:

#include <имя файла>

или

#include "имя_файла"

Если имя файла заключено между знаками "<" и ">", то он считается частью стандартной библиотеки, поставляемой вместе с компилятором. Если же имя файла заключено в двойные кавычки, то считается, что он расположен в той же папке, что и файл с исходным кодом.

Директива #define. Директива #define указывает препроцессору на необходимость выполнить подстановку в тексте программы определенной последовательности символов другой последовательностью. Формат директивы:

#define заменяемая_последовательность фрагмент_подстановки

Например:

#define MyName "John Smith"

#define Condition (a > b)

#define Operation a = b

char str[] = MyName; //Равнозначно char str[] = "John Smith";

int a, b;

if Condition Operatrion; //Равнозначно if (a > b) a = b;

В директиве #define могут использоваться параметры, благодаря чему она становится очень мощный и гибким инструментом, позволяющим заменять один простой текстовый элемент сложным выражением.

Директивы условной компиляции. Некоторые задачи отличаются лишь некоторыми параметрами, это позволяет создавать на языке С универсальный программный код. Однако для этого следует каким-то образом заменить те параметры, которые отличаются. Для таких целей используются директивы условной компиляции #ifdef, #ifndef, #else и #endif, а также #if и #elif.

Синтаксис для директивы #ifdef:

#ifdef имя_макроса

последовательность_операторов_1

#else

последовательноеть_операторов_2

#endif

Если имя макроса определено в программе, то компилируется первая последовательность операторов, в противном случае – вторая последовательность (ветка #else может и отсутствовать).

Синтаксис для директивы #ifndef:

#ifndef имя_макроса

последовательность_операторов_1

#else

последовательность_операторов_2

#endif

В данном случае, в отличие от директивы #ifdef, первая последовательность операторов выполняется в том случае, если имя макроса в программе не определено.

Для условной компиляции можно также воспользоваться директивами #if, #elif. Их синтаксис:

#if выражение1

последовательность_операторов_1

#elif выражение2

последовательность_операторов_2

#else

последовательность_операторов_3

#endif

Эта конструкция работает аналогично условному оператору if-else. Компилятор оценивает выражения после #if и #elif до тех пор, пока одно из них не даст в результате TRUE, после чего в текст программы подставляется соответствующая последовательность операторов. Если оба выражения дают FALSE, то подставляется последовательность операторов после директивы #else (если она присутствует).