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

Директивы препроцессора представляют собой инструкции, записанные в тексте программы на СИ, и делаемые до трансляции программы. Директивы препроцессора разрешают поменять текст программы, к примеру, заменить кое-какие лексемы в тексте, засунуть текст из другого файла, запретить трансляцию части текста и т.п. Все директивы препроцессора начинаются со символа #. По окончании директив препроцессора точка с запятой не ставятся.

Директива #include

Директива #include включает в текст программы содержимое указанного файла. Эта директива имеет две формы:

#include имя файла

#include

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

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

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

Директива #define

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

Директива #define имеет две синтаксические формы:

#define идентификатор текст

#define идентификатор (перечень параметров) текст

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

Пример:

#define WIDTH 80

#define LENGTH (WIDTH+10)

Эти директивы поменяют в тексте программы каждое слово WIDTH на число 80, а каждое слово LENGTH на выражение (80+10) вместе с окружающими его скобками.

Скобки, содержащиеся в макроопределении, разрешают избежать недоразумений, которые связаны с порядком вычисления операций. К примеру, при отсутствии скобок выражение t=LENGTH*7 будет преобразовано в выражение t=80+10*7, а не в выражение t=(80+10)*7, как это получается при наличии скобок, и в следствии окажется 780, а не 630.

Во второй синтаксической форме в директиве #define имеется перечень формальных параметров, что может содержать один либо пара идентификаторов, поделённых запятыми. Формальные параметры в тексте макроопределения отмечают позиции на каковые должны быть подставлены фактические доводы макровызова. Любой формальный параметр может показаться в тексте макроопределения пара раз.

При макровызове за идентификатором записывается перечень фактических доводов, количество которых должно совпадать с числом формальных параметров.

Пример:

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

Эта директива заменит фрагмент

t=MAX(i,s[i]);

на фрагмент

t=((i)&семь дней;(s[i])?(i):(s[i]);

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

К примеру, при наличии скобок фрагмент

t=MAX(ij,s[i]||j);

будет заменен на фрагмент

t=((ij)(s[i]||j)?(ij):(s[i]||j);

а при отсутствии скобок — на фрагмент

t=(ijs[i]||j)?ij:s[i]||j;

в котором условное выражение вычисляется в совсем втором порядке.

Директива #undef

Директива #undef употребляется для отмены действия директивы #define. Синтаксис данной директивы следующий #undef идентификатор

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

Пример:

#undef WIDTH

#undef MAX

Эти директивы отменяют определение именованной константы WIDTH и макроопределения MAX.

// Программирование на Си #9 // Директивы препроцессора //

Похожие статьи:

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock
detector