Урок 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 "win.h"
#endif

В программу будет включен файл win.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 и
#if defined(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 сайтов