Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по С Живицкая (Мет пособие).doc
Скачиваний:
112
Добавлен:
15.06.2014
Размер:
2.11 Mб
Скачать

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

Директива #undef ограничивает область действия директивы #define.

Директива имеет следующий формат:

#undef идентификатор,

где идентификатор – это идентификатор, определённый ранее в директиве define.

Пример: #undef ESCAPE

Если в дальнейшем тексте программы появится вызов ESCAPE (), он будет рассматриваться как обращение к функции, а не как символичный идентификатор.

Директива #undef используется:

Для изменения условия в директиве #ifdef

Для исключения дублирования макроимён.

Последний случай может иметь место при включении файла с помощью директивы

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

2.7.5.Условная компиляция.

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

Условная компиляция – это выборочная компиляция только тех частей программы, которые удовлетворяют некоторым условиям. Например, могут быть откомпилированы только те части программы, которые относятся к определённому окружению. Условная компиляция имеет следующие преимущества:

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

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

Решение о включении той или иной части программы принимается на этапе компиляции, а не во время выполнения. Это повышает эффективность программы (но уменьшает её гибкость).

Для условной компиляции используется препроцессорная директива #if. Она имеет 2 формы:

1.без else части.

заголовок_ if

оператор1

#endif

2.с else частью

заголовок_if

оператор1

#else

оператор2

#endif где #endif используется для обозначения конца блока if

Здесь заголовок_if содержит условие в зависимости от значения, которое выполняется оператор1 или оператор2. Оператор1 выполняется если условие в заголовке_if истинно, оператор2 если ложно.

Заголовок_if имеет 3 формы:

#if константное выражение. Если константное выражение отличается от 0, условие истинно, если равно 0, условие ложно.

#ifdef . Условие истинно, если идентификатор предварительно был определён с помощью директивы #define (и не было для него директивы #undef). В противном случае ложно.

#ifndef условие истинно, если идентификатор не был определён ранее с помощью директивы #define ( или был определён, а затем к нему была применена директива #undef.

Пример. Условная компиляция.

#ifndef SIZE

#define SIZE 128

#endif

В результате переменная SIZE получает значение, если ранее она не была определена программистом.

Рекомендации по программированию.

При использовании вложенных директив условной компиляции многие компиляторы не допускают смещения вправо #if и #else. Они все должны начинаться с первой позиции.

Пример.

#ifndef MAX

оператор

#else

#if MAX= =100

оператор

#else

оператор

#endif

#endif

Примердемонстрации условной компиляции, определяется символический идентификатор RAZM_BUF в зависимости от значения переменных A,B,C.

#if A

#define RAZM_BUF 4096

#endif

#if B

#define RAZM_BUF 1024

#endif

#if C

#define RAZM_BUF 512

#endif