Книга: Язык Си - руководство для начинающих
ДРУГИЕ ДИРЕКТИВЫ: #undef, #if, #ifdef, #ifndef, #else И #endif
ДРУГИЕ ДИРЕКТИВЫ: #undef, #if, #ifdef, #ifndef, #else И #endif
Эти директивы обычно используются при программировании больших модулей. Они позволяют приостановить действие более ранних определений и создать файлы, каждый из которых можно компилировать по-разному.
Директива #undef отменяет самое последнее определение поименованного макроопределения.
#define BIG 3
#define HUGE 5
#undef BIG /* BIG теперь не определен */
#define HUGE 10 /* HUGE переопределен как 10 */
#undef HUGE /* HUGE снова равен 5*/
#undef HUGE /* HUGE теперь не определен */
Очевидно (мы надеемся), вы не будете компилировать файл, как в этом примере. Предположим, что у вас есть большой стандартный файл, определенный директивой #include, который вы хотели бы использовать, но для этого некоторые из его определений для одной из функций программы нужно будет временно изменить, Вместо того чтобы иметь дело с этим файлом, вы можете просто включить его, а затем окружить такую выделяющуюся функцию соответствующими директивами #define и #undef.
Или, предположим, что вы работаете с большой системой программ. Вы хотите задать макроопределение, но не уверены, использует ли ваше определение другие определения откуда-нибудь из другого места системы. В этом случае просто отмените ваше макроопределение в том месте, где оно вам больше не нужно, а оригинал этого макроопределения, если он есть, будет по-прежнему оставаться в силе для остальной части системы.
Другие упомянутые нами директивы позволяют выполнять условную компиляцию. Вот пример:
#ifdef MAVIS
#include " horse.h" /* выполнится, если MAVIS определен */
#define STABLES 5
#else
#include "cow.h" /*выполнится, если MAVIS не определен */
#define STABLES 15
#endif
Директива #ifdef сообщает, что если последующий идентификатор (MAVIS) определяется препроцессором, то выполняются все последующие директивы вплоть до первого появления #else или #endif. Когда в программе есть #else, то программа от #else до #endif будет выполняться, если идентификатор не определен.
Такая структура очень напоминает конструкцию if-else языка Си. Основная разница заключается в том, что препроцессор не распознает фигурные скобки {}, отмечающие блок, потому что он использует директивы #else (если есть) и #endif (которая должна быть) для пометки блоков директив.
Эти условные конструкции могут быть вложенными.
Директивы #ifdef и #if можно использовать с #else и #endif таким же образом. Директива #ifndef опрашивает, является ли последующий идентификатор неопределенным; эта директива противоположна #ifdef. Директива #if больше похожа на обычный оператор if языка Си. За ней следует константное выражение, которое считается истинным, если оно не равно нулю:
#if SYS == "IBM"
#include "ibm.h"
#endif
Одна из целей использования "условной компиляции" - сделать программу более мобильной. Изменяя несколько ключевых определений в начале файла, вы можете устанавливать различные значения и включать различные файлы для разных систем.
Эти краткие примеры иллюстрируют удивительную способность языка Си изощренно и строго управлять программами.
- ДИРЕКТИВЫ ПРЕПРОЦЕССОРА #define, #include, #undef, #if, #ifdef, #ifndef, #else, #endif
- СИМВОЛИЧЕСКИЕ КОНСТАНТЫ: #define
- ИСПОЛЬЗОВАНИЕ АРГУМЕНТОВ С #define
- МАКРООПРЕДЕЛЕНИЕ ИЛИ ФУНКЦИЯ?
- ВКЛЮЧЕНИЕ ФАЙЛА: #include
- ДРУГИЕ ДИРЕКТИВЫ: #undef, #if, #ifdef, #ifndef, #else И #endif
- ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
- ВОПРОСЫ И ОТВЕТЫ
- УПРАЖНЕНИЕ
- Другие инструменты для осуществления резервного копирования
- Другие изменения в 7-й версии InterBase
- Датчик расположения и другие датчики
- 6.4 Другие файловые системы
- Другие предикаты сравнения
- Я установил программу и не хочу, чтобы другие пользователи о ней знали. Как скрыть ее?
- Можно ли интегрировать в пакет установки Windows Service Pack и другие обновления, чтобы потом не приходилось их устанав...
- Другие варианты подключения
- Как из-под учетной записи пользователя (без администраторских привилегий) включать и отключать оборудование и выполнять ...
- В Microsoft Word не всегда удобно выделять большие фрагменты текста мышью. Есть ли другие способы?
- Другие системные вызовы для управления файлами
- 9.3.1. HTTP-директивы