Слайд 1Директивы препроцессора
Директива #include.
Директива #define.
Директива #undef.
Директивы условной компиляции.
Предопределенные макросы.
Модульность — фундаментальный
аспект всех успешно работающих крупных систем.
Б. Страуструп
Слайд 2МОДУЛЬНОСТЬ В ЯЗЫКЕ C++ ПОДДЕРЖИВАЕТСЯ С ПОМОЩЬЮ:
Директив препроцессора.
Пространств имен.
Классов памяти.
Исключений
Раздельной компиляции.
строго говоря, раздельная компиляция не является элементом
языка, а относится к его реализации.
Слайд 3ПРЕПРОЦЕССОР.
Препроцессором называется первая фаза компилятора.
Инструкции препроцессора называются директивами.
Директивы
должны начинаться с символа #, перед которым в строке могут
находиться только пробельные символы.
Слайд 5ДИРЕКТИВА #INCLUDE.
Директива #include вставляет содержимое указанного файла в ту
точку исходного файла, где она записана.
Включаемый файл также может
содержать директивы #include.
Поиск файла, если не указан полный путь, ведется в стандартных каталогах включаемых файлов.
Вместо угловых скобок могут использоваться кавычки (" ") — в этом случае поиск файла ведется в каталоге, содержащем исходный файл, а затем уже в стандартных каталогах.
Директива #include является простейшим средством обеспечения согласованности объявлений в различных файлах, она включает в них информацию об интерфейсе из заголовочных файлов.
Слайд 6ЗАГОЛОВОЧНЫЕ ФАЙЛЫ.
Заголовочные файлы обычно имеют расширение .h и могут содержать:
определения типов, констант, встроенных функций, шаблонов, перечислений;
объявления функций, данных, имен,
шаблонов;
пространства имен;
директивы препроцессора;
комментарии.
Слайд 7Заголовочные файлы.
В заголовочном файле не должно быть определений функций и
данных.
Эти правила не являются требованием языка, а отражают разумный способ
использования директивы.
При указании заголовочных файлов стандартной библиотеки расширение .h можно опускать.
Старые версии компиляторов могут не поддерживать это требование стандарта.
Слайд 8Заголовочные файлы.
Для каждого файла библиотеки С с именем имеется
соответствующий файл библиотеки C++ , в котором те же средства
описываются в пространстве имен std.
Например, директива #include обеспечивает те же возможности, что и #include , но при обращении к стандартным функциям требуется указывать имя пространства имен std.
Слайд 10ДИРЕКТИВА #DEFINE.
Директива #define определяет подстановку в тексте программы.
Она используется
для определения:
символических констант:
#define имя текст_подстановки
(все вхождения имени заменяются на
текст подстановки);
макросов, которые выглядят как функции, но реализуются подстановкой их текста в текст программы:
#define имя( параметры ) текст_подстановки
символов, управляющих условной компиляцией.
Формат: #define имя
Слайд 11Директива #define.
Примеры:
#define VERSION 1
#define VASIA "Василий Иванович"
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MUX
Имена
рекомендуется записывать прописными буквами
чтобы зрительно отличать их от имен переменных
и функций
Слайд 12Директива #define.
#define MAX(x,y) ((x)>(y)?(x):(y))
Параметры макроса используются при макроподстановке, например, если
в тексте программы используется вызов макроса:
у = MAX(sum1, sum2);
он будет
заменен на:
у = ((suml)>(sum2)?(suml):(sum2));
Слайд 13Директива #define.
Отсутствие круглых скобок может привести к неправильному порядку вычисления
поскольку
препроцессор не оценивает вставляемый текст с точки зрения синтаксиса.
Например:
если к
макросу
обратиться как
в результате подстановки получится выражение:
#define sqr(x) (x*x)
sqr(y+1)
(у+1*у+1)
Слайд 14Директива #define.
Макросы и символические константы унаследованы из языка С, при
написании программ на C++ их следует избегать.
Вместо символических констант предпочтительнее
использовать const или enum, а вместо макросов — встроенные функции или шаблоны.
Слайд 16ДИРЕКТИВА #UNDEF.
Директива #undef удаляет определение символа.
Используется редко, например, для
отключения какой-либо опции компилятора.
Формат: #undef имя
Слайд 18ДИРЕКТИВЫ УСЛОВНОЙ КОМПИЛЯЦИИ.
Директивы условной компиляции #if, #ifdef и #ifndef применяются
для того, чтобы исключить компиляцию отдельных частей программы.
Слайд 19Директива #if.
Формат :
#if константное_выражение
......
[ #elif константное_выражение
......]
[ #elif константное_выражение
......]
[ #else
......]
#endif
Количество
директив #elif — произвольное.
Слайд 20Директива #if.
Пример:
// Пример условного включения
// различных версий заголовочного файла
#if
VERSION == 1
#define INCFILE "vers1.h“
#elif VERSION == 2
#define
INCFILE "vers2.h"
/* и так далее */
#else
#define INCFILE "versN.h“
#endif
#include INCFILE
В константных выражениях может использоваться проверка, определена ли константа, с помощью
defined (имя_константы).
Слайд 21Директивы #ifdef и #ifndef.
Формат :
#ifdef символ
// Расположенный ниже код компилируется,
//
если символ определен
#ifndef символ
// Расположенный ниже код компилируется,
// если символ
не определен
Действие этих директив распространяется до первого #elif, #else или #endif.
Слайд 22Директива #ifdef.
Пример:
// Директива #ifndef часто применяется для того,
// чтобы обеспечить
включение заголовочного
// файла только один раз
#ifndef HEADER_INCLUDED
#include "myheader.h"
#define HEADER_NCLUDED
#endif
Слайд 23Предопределенные макросы
В C++ определено несколько макросов, предназначенных в основном для
того, чтобы выдавать информацию о версии программы или месте возникновения
ошибки.
Слайд 24Предопределенные макросы.
_cplusplus
определен, если программа компилируется как файл C++.
применяется, если требуется
переносить код из С в C++ и обратно.
Многие компиляторы при
обработке файла с расширением .с считают, что программа написана на языке С.
Использование этого макроса позволяет указать, что можно использовать возможности C++:
#ifdef _cplusplus
// Действия, специфические для C++
#endif
Слайд 25Предопределенные макросы.
_DATE_
содержит строку с текущей датой в формате месяц день
год.
_FILE_
содержит строку с полным именем текущего файла.
_LINE_
текущая строка исходного текста.
_TIME_
текущее
время.
printf("Ошибка в файле %s \n", _FILE_);
printf(" Дата компиляции - %s \n", _DATE_);
printf(“ Время компиляции:%s\n ", _FILE_, _TIME_);
Слайд 26Предопределенные макросы.
Пример:
// Директива #ifndef часто применяется для того,
// чтобы обеспечить
включение заголовочного
// файла только один раз
#ifndef HEADER_INCLUDED
#include "myheader.h"
#define HEADER_NCLUDED
#endif