Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
http.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.34 Mб
Скачать

Директивы условной компиляции

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

#if, #else, #elif и #endif

Если после #if константное выражение принимает истинное значение, то код между #if и #endif компилируется, в противном случае код пропускается. Директива #endif используется для обо­значения конца блока #if. Стандартный вид #if следующий: #if константное_выражение последовательность операторов #endif

Например: /* простой пример с #if */ #include <stdio.h> #define MAX 100 int main(void) { #if MAX>99 printf("Compiled for array greater than 99.\n"); #endif return 0; }

Данная программа выводит сообщение на экран, поскольку, как определено в программе, МАХ имеет значение больше 99. Данный пример демонстрирует очень важный момент: выражение, следующее зa #if, вычисляется на этапе компиляции, следовательно, оно должно содержать ранее определенные идентификаторы и константы, а не переменные.

Работа #else во многом похожа на работу оператора else — она предоставляет альтернативный вариант, если #if содержит ложное состояние. Предыдущий пример можно расширить следую­щим образом:

/* простой пример с #if / #else */ #include <stdio.h> #def ine MAX 10 int main(void) { # if MAX>99 printf("Compiled for array greater than 99.\n"); #else printf("Compiled for small array.\n"); #endif return 0; }

В данном случае MAX определяется так, чтобы значение было меньше 99, в результате чего ком­пилируется не код, соответствующий #if, а код, соответствующий #else. Следовательно, выводится сообщение «Compiled for small array».

Обратим внимание, что #else используется для обозначения конца блока #if и начала блока #else. Это делается потому, что может быть только один #endif, связанный c #if.

#elif означает «иначе если» и используется для построения лесенки if-else-if с целью определе­ния различных опций компиляции. За #elif следует константное выражение. Если выражение истинно, то блок кода компилируется и остальные выражения не проверяются. В противном слу­чае рассматривается следующий блок. Стандартный вид #elif следующий: #if выражение последовательность операторов #elif выражение 1 последовательность операторов #elif выражение 2 последовательность операторов #elif выражение 3 последовательность операторов #elif выражение 4 последовательность операторов ... #elif выражение N последовательность операторов #endif

Например, следующий фрагмент использует значение ACTIVE_COUNTRY для определения де­нежного знака: #define US 0 #define ENGLAND 1 #define FRANCE 2 #define ACTIVE_COUNTRY US #if ACTIVE_COUNTRY==US char currency[] = "dollar"; #elif ACTIVE_COUNTRY==ENGLAND char currency[] = "pound"; #else char currency[] = "franc"; #endif

#if и #elif могут быть вложенными. Если это имеет место, то каждый #endif, #else или #elif ассоциируется с ближайшим #if или #elif. Например, следующее совершенно корректно: #if МАХ>100 #if SERIAL_VERSION int port = 198; #elif int port = 200; #endif #else char out_buffer[100] ; #endif

В Borland С++ в операторе #if можно использовать оператор времени компиляции sizeof. На­пример, следующая программа определяет, компилируется программа для больших или малень­ких массивов: #if (sizeof(char *) == 2) printf("Program compiled for small array."); #else printf("Program compiled for large array."); #endif

#ifdef u #ifndef

Другой метод условной компиляции состоит в использовании директив #ifdef и #ifndef, что соответ­ственно означает «если определено» и «если не определено». Стандартный вид #ifdef следующий: #ifdef имя_макроса последовательность операторов #endif

Если имя макроса определено ранее в операторе #define, то последовательность операторов, сто­ящих между #ifdef и #endif, будет компилироваться. Стандартный вид #ifndef следующий: #ifndef имя_макроса последовательность операторов #endif

Если имя макроса не определено ранее в операторе #define, то последовательность операторов, стоящих между #ifdef и #endif, будет компилироваться.

Kaк #ifdef, так и #ifndef могут использовать оператор #else, но нe #elif. Например: #include <stdio.h> #define TED 10 int main(void) { #ifdef TED printf("Hi Ted\n"); #else printf("Hi anyone\n"); #endif #ifndef RALPH printf("RALPH not defined\n"); #endif return 0; }

выводит «Hi Ted» и «RALPH not defined». Если TED не определен, то выведется «Hi anyone», a за ним «RALPH not defined».

#ifdef и #ifndef можно вкладывать друг в друга так же, как и #if.

#undef

Директива #undef используется для снятия определения макроса. Она имеет следующий вид: #undef имя_макроса

Например: #define LEN 100 #define WIDTH 100 char array[LEN][WIDTH]; #undef LEN #undef WIDTH /* в данный момент как LEN, так и WIDTH не определены */ Как LEN, так и WIDTH определены, пока не встретится соответствующий #undef.

Основное назначение #undef состоит в локализации имен макросов только в тех частях, где они необходимы.

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