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

Директива #include

Директива #include дает указание компилятору читать еще один исходный файл в дополнение к тому, в котором находится сама директива [3]. Имя исходного (подключаемого файла) файла должно быть заключено в двойные кавычки или угловые скобки. Обычно имена стандартных заголовочных файлов заключают в угловые скобки, а кавычки приберегают для имен специальных файлов, относящихся к конкретной программе. Способ поиска файла зависит от того, в кавычках или угловых скобках находится его имя. Если имя заключено в угловые скобки, то поиск файла проводится тем способом, который определен в компиляторе. Часто это означает поиск определенного каталога, специально предназначенного для хранения таких файлов. Если имя заключено в кавычки, то поиск файла проводится другим способом. Во многих компиляторах это означает поиск файла в текущем рабочем каталоге. Если же файл не найден, то поиск повторяется уже так, как будто имя файла заключено в угловые скобки [3].

Файлы, имена которых находятся в директивах #include, могут в свою очередь содержать другие директивы #include. Они называются вложенными. Количество допустимых уровней вложенности у разных компиляторов может быть разным. Однако в стандарте С89 предусмотрено, что компиляторы должны допускать не менее 8 таких уровней [3].

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

Директивы условной компиляции дают возможность выборочно компилировать части исходного кода программы. Этот процесс называется условной компиляцией [3].

Директива #if выглядит следующим образом:

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

последовательность операторов программного кода

#endif

Если находящееся за директивой #if константное выражение истинно, то компилируется код, который находится между этим выражением и #endif, обозначающей конец блока #if. Константное выражение может быть задано через директиву #define. При этом если, например, задано число, не равное нулю, то такое константное выражение будет истинно; если же заданное число есть нуль, то константное выражение будет ложным. В частности, константное выражение может быть задано макросом с формальными параметрами, которые должны быть в свою очередь также константными параметрами.

Директива условной компиляции #else используется практически также, как в обычном условном операторе языка С: ifelse. Дополнительная директива условной компиляции #else в общем случае имеет вид

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

последовательность операторов программного кода

#else

альтернативная последовательность операторов программного кода

#endif

Аналогично используются директивы #elif (else if), которые в общем случае имеют следующий вид:

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

последовательность операторов программного кода

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

2_ Я_последовательность операторов программного кода

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

3_ Я_последовательность операторов программного кода

.

.

.

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

N_ я_последовательность операторов программного кода

#else

альтернативная последовательность операторов программного кода

#endif

Если константное выражение в директиве #elif истинно (не нулевое, например), то будет компилироваться соответствующая последовательность операторов программного кода. При этом другие выражения в директивах #elif проверяться уже не будут, в том числе директива #else.

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

В соответствии со стандартом С89 у директив #if и #elif может быть не менее 8 уровней вложенности. При вложенности каждая директива #endif, #else или #elif относится к ближайшей директиве #if или #elif [3]. Каждая директива #if сопровождается директивой #endif.

Директива условной компиляции #ifdef в общем виде выглядит следующим образом:

#ifdef имя_макроса

последовательность операторов

#endif

Директива условной компиляции #ifdef означает «if defined» (если определено) [3]. Последовательность операторов будет компилироваться, если имя макроса было определено ранее с помощью директивы #define.

Директива условной компиляции #ifndef означает «if not defined» (если не определено) в общем виде выглядит следующим образом:

#ifndef имя_макроса

последовательность операторов

#endif

Последовательность операторов будет компилироваться, если имя макроса еще не определено директивой #define. В директивах #ifdef и #ifndef можно использовать #else или #elif. Согласно стандарту С89 допускается не менее 8 уровней #ifdef и #ifndef.

Директива #undef удаляет заданное определение имени макроса, то есть «аннулирует» его определение; само имя макроса должно находиться после директивы [3]. Используется в основном для того, чтобы локализовать имена макросов в тех участках кода, где они нужны.

В общем случае эта директива выглядит следующим образом:

#undef имя_макроса

Для того чтобы узнать, определено ли имя макроса, можно использовать директиву #if в сочетании с оператором времени компиляции defined [3], который выглядит следующим образом:

defined имя_макроса

Если имя_макроса определено, то выражение считается истинным, в противном случае – ложным.

Единственная причина, по которой используется оператор defined, состоит в том, что с его помощью в #elif можно узнать, определено ли имя макроса [3].

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