Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
.doc
Скачиваний:
4
Добавлен:
23.09.2019
Размер:
440.83 Кб
Скачать

35) Директива препроцессора #define: создание макрофункций с помощью директивы #define (в2б5, в3б30)

Директива #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(i&j,s[i]||j);

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

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

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

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

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

36) Директивы условной компиляции #if, #else, #elif, #endif, #ifdef, #ifndef (в2б6, в3б24)

#if, #ifdef, #ifndef применяются для исключения компиляции отдельных частей программы. Это бывает полезно при отладке или при поддержки нескольких версий программы для различных платформ.

Формат директивы #if:

#if константное_выражение

[#elif константное_выражение…]

[#elif константное_выражение…]

[#else …]

#endif

Директива #if вместе с директивами #elif, #else и #endiif управляет компиляцией частей исходного файла. Каждой директиве #if в исходном файле должна соответствовать закрывающая директива #endif. Между директивами #if и #endif допускается нуль или более директив #elif и не более одной директивы #else. Директива #else, если она есть, должна быть расположена непосредственно перед директивой #endif.

Синтаксис директив #ifdef и #ifndef:

#ifdef [определитель]

#ifndef [определитель]

Директивы #ifdef и #ifndef выполняют те же самые задачи, что и директива #if, использующая defined ([определитель]). Эти директивы могут быть использованы там же, где используется директива #if, и используются исключительно для компактности записи.Когда препроцессор обрабатывает директиву ifdef, то делается проверка идентификатора [определитель] на истинность (не нуль).

Директива #ifdef является отрицанием директивы #ifdef. Другими словами, если [определитель] не определен (или его определение отменено директивой #undef), то его значение истинно (не нуль). В противном случае значение ложно (нуль).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]