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

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

Для условной
компиляции используются директивы препроцессора #if, #ifdef, #ifndef, #else,
#elif, #endif. Общая форма записи конструкции #if-#else-#endif:

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

#else или #elif
_константное выражение_

_операторы_

#endif

Директива #else и следующие за ней операторы могут отсутствовать.

Если _константное
выражение_, входящее в состав директивы #if истинно (отлично от 0),
компилируются операторы и выполняются директивы препроцессора, заключенные
между директивами #if и #else, а операторы и директивы препроцессора между
#else и #endif игнорируются. Если директива #else отсутствует, то компилируются
операторы, заключенные между директивами #if и #endif.

Если константное выражение, входящее в состав директивы #if ложно
(равно 0), то компилируются операторы и выполняются директивы препроцессора,
заключенные между директивами #else и #endif, а операторы и директивы
препроцессора между #if и #else игнорируются. Если директива #else отсутствует,
операторы между директивами #if и #endif игнорируются.

Например:

#define MSDOS 1

#define UNIX 2

#define OS MSDOS

. . .

#if OS==UNIX

#include "unix.h"

#else

#include "msdos.h"

#endif

В программу будет включен файл msdos.h, а если изменить директиву
#define следующим образом:

#define OS UNIX ,

в программу будет включен файл unix.h.

Директива #elif (else+if)
играет ту же роль, что и директива #else
за одним исключением: операторы, заключенные между директивами #elif и #endif компилируются если константное выражение, входящее в состав директивы
#if ложно (равно 0), а константное выражение,
входящее в состав директивы #elif
истинно (отлично от 0).

Вместо директивы #if
может быть записана директива #ifdef
или директива #ifndef. Общая форма записи директив #ifdef и #ifndef:

#ifdef _идентификатор_#ifndef _идентификатор_

Если _идентификатор_, указанный в директиве #ifdef определен ранее с помощью директивы #define, то компилируются операторы и выполняются
директивы препроцессора, заключенные между директивами #ifdef и #else,
а операторы и директивы препроцессора между #else и #endif
игнорируются. Если директива #else
отсутствует, компилируются операторы заключенные между директивами #ifdef и #endif. Если _идентификатор_ не определен, операторы, заключенные между
директивами #ifdef и #else игнорируются, а операторы, заключенные между директивами #else и #endif компилируются (если директива #else отсутствует, операторы между #ifdef и #endif игнорируются).

Директива #ifndef работает в
точности наоборот: если _идентификатор_, указанный в директиве #ifndef, не определен ранее с помощью директивы #define, компилируются операторы, следующие за #ifndef, а если определен - операторы, следующие за #else (если директива #else присутствует).

Например:

#ifndef COLORS

#include <graphics.h>

#endif

 

#ifdef IBM

#include "ibm.h"

#else

#include "unknown.h"

#endif

В константном выражении, входящем в состав директивы #if может использоваться операция defined. Форма записи этой операции: defined(_идентификатор_). Результатом этой операции
является 1, если _идентификатор_ был определен ранее с помощью директивы #define и 0 в противном случае. Нетрудно заметить, что
директивы #ifdef A и #ifdefined(A)

абсолютно идентичны.
Но операцией defined удобнее пользоваться в сложном выражении, входящем в
состав директивы #if, как, например
в следующем случае:

#if defined(A) ||
defined(B) || defined(C)

Все директивы условной компиляции должны заканчиваться в том же файле,
в котором они начались, то есть если файл содержит директиву #if (#ifdef,
#ifndef), то относящиеся к ней директивы #else (или #elif) и #endif должны содержаться в том же файле. Как
видите, конструкция препроцесссора #if-#else-#endif
очень похожа на конструкцию языка Си if-else. Разница заключается в том что
директивы препроцессора выполняются при компиляции программы, а операторы языка
Си во время ее выполнения.

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов