Директивы условной компиляции. Предопределенные макросы.

Содержание

Слайд 2

МОДУЛЬНОСТЬ В ЯЗЫКЕ C++ ПОДДЕРЖИВАЕТСЯ С ПОМОЩЬЮ: Директив препроцессора. Пространств имен.

МОДУЛЬНОСТЬ В ЯЗЫКЕ C++ ПОДДЕРЖИВАЕТСЯ С ПОМОЩЬЮ:

Директив препроцессора.
Пространств имен.
Классов

памяти.
Исключений
Раздельной компиляции.
строго говоря, раздельная компиляция не является элементом языка, а относится к его реализации.
Слайд 3

ПРЕПРОЦЕССОР. Препроцессором называется первая фаза компилятора. Инструкции препроцессора называются директивами. Директивы

ПРЕПРОЦЕССОР.

Препроцессором называется первая фаза компилятора.
Инструкции препроцессора называются директивами.

Директивы должны

начинаться с символа #, перед которым в строке могут находиться только пробельные символы.
Слайд 4

Директива #include.

Директива #include.

Слайд 5

ДИРЕКТИВА #INCLUDE. Директива #include вставляет содержимое указанного файла в ту точку

ДИРЕКТИВА #INCLUDE.

Директива #include <имя_файла> вставляет содержимое указанного файла в ту точку

исходного файла, где она записана.
Включаемый файл также может содержать директивы #include.
Поиск файла, если не указан полный путь, ведется в стандартных каталогах включаемых файлов.
Вместо угловых скобок могут использоваться кавычки (" ") — в этом случае поиск файла ведется в каталоге, содержащем исходный файл, а затем уже в стандартных каталогах.
Директива #include является простейшим средством обеспечения согласованности объявлений в различных файлах, она включает в них информацию об интерфейсе из заголовочных файлов.
Слайд 6

ЗАГОЛОВОЧНЫЕ ФАЙЛЫ. Заголовочные файлы обычно имеют расширение .h и могут содержать:

ЗАГОЛОВОЧНЫЕ ФАЙЛЫ.

Заголовочные файлы обычно имеют расширение .h и могут содержать:
определения

типов, констант, встроенных функций, шаблонов, перечислений;
объявления функций, данных, имен, шаблонов;
пространства имен;
директивы препроцессора;
комментарии.
Слайд 7

Заголовочные файлы. В заголовочном файле не должно быть определений функций и

Заголовочные файлы.

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

Эти

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

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

Старые версии компиляторов могут не поддерживать это требование стандарта.

Слайд 8

Заголовочные файлы. Для каждого файла библиотеки С с именем имеется соответствующий

Заголовочные файлы.

Для каждого файла библиотеки С с именем имеется соответствующий

файл библиотеки C++ , в котором те же средства описываются в пространстве имен std.

Например, директива #include обеспечивает те же возможности, что и #include , но при обращении к стандартным функциям требуется указывать имя пространства имен std.

Слайд 9

Директива #define.

Директива #define.

Слайд 10

ДИРЕКТИВА #DEFINE. Директива #define определяет подстановку в тексте программы. Она используется

ДИРЕКТИВА #DEFINE.

Директива #define определяет подстановку в тексте программы.
Она используется для

определения:
символических констант:
#define имя текст_подстановки
(все вхождения имени заменяются на текст подстановки);
макросов, которые выглядят как функции, но реализуются подстановкой их текста в текст программы:
#define имя( параметры ) текст_подстановки
символов, управляющих условной компиляцией.
Формат: #define имя
Слайд 11

Директива #define. Примеры: #define VERSION 1 #define VASIA "Василий Иванович" #define

Директива #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)) Параметры макроса используются при макроподстановке, например,

Директива #define.

#define MAX(x,y) ((x)>(y)?(x):(y))

Параметры макроса используются при макроподстановке, например, если в

тексте программы используется вызов макроса:

у = MAX(sum1, sum2);

он будет заменен на:

у = ((suml)>(sum2)?(suml):(sum2));

Слайд 13

Директива #define. Отсутствие круглых скобок может привести к неправильному порядку вычисления

Директива #define.

Отсутствие круглых скобок может привести к неправильному порядку вычисления

поскольку препроцессор

не оценивает вставляемый текст с точки зрения синтаксиса.

Например:

если к макросу
обратиться как
в результате подстановки получится выражение:

#define sqr(x) (x*x)

sqr(y+1)

(у+1*у+1)

Слайд 14

Директива #define. Макросы и символические константы унаследованы из языка С, при

Директива #define.

Макросы и символические константы унаследованы из языка С, при написании

программ на C++ их следует избегать.

Вместо символических констант предпочтительнее использовать const или enum, а вместо макросов — встроенные функции или шаблоны.

Слайд 15

Директива #undef.

Директива #undef.

Слайд 16

ДИРЕКТИВА #UNDEF. Директива #undef удаляет определение символа. Используется редко, например, для

ДИРЕКТИВА #UNDEF.

Директива #undef удаляет определение символа.
Используется редко, например, для отключения

какой-либо опции компилятора.
Формат: #undef имя
Слайд 17

Директивы условной компиляции.

Директивы условной компиляции.

Слайд 18

ДИРЕКТИВЫ УСЛОВНОЙ КОМПИЛЯЦИИ. Директивы условной компиляции #if, #ifdef и #ifndef применяются

ДИРЕКТИВЫ УСЛОВНОЙ КОМПИЛЯЦИИ.

Директивы условной компиляции #if, #ifdef и #ifndef применяются для

того, чтобы исключить компиляцию отдельных частей программы.
Слайд 19

Директива #if. Формат : #if константное_выражение ...... [ #elif константное_выражение ......]

Директива #if.

Формат :

#if константное_выражение
......
[ #elif константное_выражение
......]
[ #elif константное_выражение
......]
[ #else
......]
#endif

Количество директив

#elif — произвольное.
Слайд 20

Директива #if. Пример: // Пример условного включения // различных версий заголовочного

Директива #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 символ // Расположенный ниже

Директивы #ifdef и #ifndef.

Формат :

#ifdef символ
// Расположенный ниже код компилируется,
// если

символ определен
#ifndef символ
// Расположенный ниже код компилируется,
// если символ не определен

Действие этих директив распространяется до первого #elif, #else или #endif.

Слайд 22

Директива #ifdef. Пример: // Директива #ifndef часто применяется для того, //

Директива #ifdef.

Пример:

// Директива #ifndef часто применяется для того,
// чтобы обеспечить включение

заголовочного
// файла только один раз
#ifndef HEADER_INCLUDED
#include "myheader.h"
#define HEADER_NCLUDED
#endif
Слайд 23

Предопределенные макросы В C++ определено несколько макросов, предназначенных в основном для

Предопределенные макросы

В C++ определено несколько макросов, предназначенных в основном для того,

чтобы выдавать информацию о версии программы или месте возникновения ошибки.
Слайд 24

Предопределенные макросы. _cplusplus определен, если программа компилируется как файл C++. применяется,

Предопределенные макросы.

_cplusplus

определен, если программа компилируется как файл C++.
применяется, если требуется переносить

код из С в C++ и обратно.

Многие компиляторы при обработке файла с расширением .с считают, что программа написана на языке С.
Использование этого макроса позволяет указать, что можно использовать возможности C++:
#ifdef _cplusplus
// Действия, специфические для C++
#endif

Слайд 25

Предопределенные макросы. _DATE_ содержит строку с текущей датой в формате месяц

Предопределенные макросы.

_DATE_

содержит строку с текущей датой в формате месяц день год.

_FILE_

содержит

строку с полным именем текущего файла.

_LINE_

текущая строка исходного текста.

_TIME_

текущее время.

printf("Ошибка в файле %s \n", _FILE_);
printf(" Дата компиляции - %s \n", _DATE_);
printf(“ Время компиляции:%s\n ", _FILE_, _TIME_);