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




Директива #include

Директива #include <имя_файла> вставляет содержимое указанного файла в ту точку исходного файла, где она записана. Она также является простейшим средством обеспечения согласованности объявлений в различных файлах, она включает в них информацию об интерфейсе из заголовочных файлов.

Включаемый файл также может содержать в себе директивы #include. Если к файлу не указан полный путь, то поиск требуемого файла осуществляется в стандартных каталогах включаемых файлов. В самой директиве вместо угловых скобок могут использоваться кавычки (“”). В таком случае поиск файла сначала ведется в каталоге, содержащем исходный файл, а затем уже в стандартных каталогах.

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

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

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

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

Для каждого файла библиотеки С с именем <name.h> имеется соответствующий файл библиотеки C++ <cname>, в котором те же средства описываются в пространстве имен std. Например, директива #include <cstdio> обеспечивает те же возможности, что и #include <stdio.h>, но при обращении к стандартным функциям требуется указывать имя пространства имен std.

Директива #define

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

Синтаксис определения символических констант имеет следующий вид:

#define имя текст_подстановки

Это говорит о том, что все вхождения имени будут заменены на текст подстановки.

Синтаксис определения макросов имеет вид:

#define имя(параметры) текст_подстановки

Синтаксис определения символов, управляющих условной компиляцией имеет следующий вид:

#define имя

 

Пример 1. Использование директивы #define. #define VERSION 1 #define VASIA "Василий Иванович" #define MAX(x,y) ((x)>(y)?(x):(y)) #define MUX

Чтобы зрительно отличать имена в директиве #define от имен переменных и функций рекомендуется записывать их прописными буквами.

В представленном примере, параметры макроса MAX используются при подстановке. Так, например, если в тексте программы используется вызов вида: maxSum = MAX(sum1, sum2), то он будет заменён на следующую запись: maxSum = ((sum1)>(sum2)?(sum1):(sum2)).

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

Пример 2. Использование директивы #define и выражения без явной установки порядка вычисления. #define sqr(x)(x*x) // макрос sqr(y+1) // обращение к макросу

В результате подстановки в примере 2 будет получено выражение вида: (y+1*y+1).

Макросы и символические константы унаследованы из языка С, при написании программ на C++ их следует избегать. Сделать это можно например использованием const и enum вместо символических констант и встроенных шаблонов и функций вместо макросов.

Директива #undef

Эта директива предназначена для удаления определения именованной константы или макроопределения. Как правило, её использование – редкое явление.

Синтаксис:

#undef имя

 

Пример 3. Использование директивы #undef. #defineLEN 2000 // инструкция 1 charstr[LEN]; // инструкция 2 #undefLEN // инструкция 3

После того, как будет встречена инструкция 3, именованная константа LEN будет не определена.

Таким образом, основное назначение #undef состоит в локализации идентификаторов только в тех частях программы, в которых они необходимы.

Не будет считаться ошибкой то, если описанная директива была применена к идентификатору, который ранее не был определён или же если действие его определения уже было отменено. Следовательно, это может быть использовано для гарантии того, что идентификатор однозначно не определён после указанно места.

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

Существует несколько директив условной компиляции, которые предназначены для изменения порядка компиляции программы в зависимости от «настроек». Такой процесс называется условной компиляцией и широко применяются в разработке коммерческого ПО, которое предоставляет и поддерживает сразу несколько версий программы.

К директивам условной компиляции относят #if, #ifdef и #ifndef.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-09-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: