ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4269
Скачиваний: 28
Часть I. Язык программирования С
126
#else
printf("Version = %d\n", 2); /* Version = 2 */
#endif
Директива
#elif
служит для вставки в текст программы фрагмен-
та исходного кода в зависимости от истинностного значения вы-
ражения, альтернативного выражению директивы
#if
. Комбина-
ция директив
#if
и
#elif
имеет следующий вид:
#if выражение_1
исходный_код_1
#elif выражение_2
исходный_код_2
...
#elif выражение_n
исходный_код_n
#endif
В этом случае в текст программы вставляется тот фрагмент кода,
который соответствует первому истинному выражению. При
этом значения выражений вычисляются последовательно.
Совместно с директивами
#if
и
#elif
возможно использование
директивы
#else
. При этом нужно учитывать, что директива
#else
всегда должна быть одна и находиться перед директивой
#endif
.
Так как вставка фрагмента кода в исходный текст программы вы-
зывает компиляцию этого кода, то рассмотренные в этом разделе
директивы часто называют
директивами условной компиляции
.
9.4. Директивы
#ifdef
и
#ifndef
Директива
#ifdef
служит для включения фрагмента исходного
кода в текст программы при условии, что определено некоторое
символическое имя. Эта директива имеет следующий синтаксис:
#ifdef символическое_имя
исходный_код
Здесь
исходный_код
включается в текст программы при условии,
что определено
символическое_имя
. Заканчивается фрагмент ис-
Глава 9. Директивы препроцессора
127
ходного кода директивой
#endif
. Вместе с директивой
#ifdef
мо-
жет использоваться директива
#else
. Например:
#define DEBUG
#ifdef DEBUG
printf("DEBUG is defined.\n"); /* DEBUG is defined */
#else
printf("DEBUG is not defined.\n");
#endif
Директива
#ifndef
служит для условного включения фрагмента
исходного кода в текст программы при условии, что не определе-
но некоторое символическое имя. Эта директива имеет следую-
щий синтаксис:
#ifndef символическое_имя
исходный_код
Здесь
исходный_код
включается в текст программы при условии,
что
символическое_имя
не определено. Остальные правила исполь-
зования директивы
#ifndef
совпадают с правилами использова-
ния директивы
#ifdef
.
В заключение этого раздела отметим, что директива
#ifdef
может
заменяться директивой
#if defined
, а директива
#ifndef
— ди-
рективой
#if !defined
.
9.5. Директива
#include
Директива
#include
предписывает препроцессору поместить в
программу текст из файла на место этой директивы. Порядок по-
иска файла предопределен в компиляторе. Эта директива имеет
один из следующих вариантов использования:
#include "имя_файла"
#include <имя_файла>
#include символическое_имя
Здесь
имя_файла
должно быть символьной строкой, определяю-
щей путь к файлу.
Часть I. Язык программирования С
128
Обычно в первом случае файл с заданным именем ищется снача-
ла в текущем каталоге, а затем в каталогах, заданных в среде раз-
работки. Например, директива:
#include "my_file.h"
вставляет в программу текст из файла
my_file.h
, который нахо-
дится в текущем каталоге проекта.
Во втором случае файл с заданным именем обычно ищется толь-
ко в каталогах, заданных в среде разработки. Например, дирек-
тива:
#include <stdio.h>
вставляет в программу текст из файла
stdio.h
, который находит-
ся в стандартных каталогах (указанных компилятору).
Если в кавычках задан полный путь к файлу, то препроцессор
ищет файл только по этому пути, игнорируя стандартные катало-
ги. Например, директива:
#include "C:\my_file.h"
подключает в программу текст из файла
my_file.h
, который на-
ходится на диске С:.
В третьем случае препроцессор подставляет в текст программы
значение символической переменной, которое должно представ-
лять символьную строку с именем файла, заключенном в кавычки
или угловые скобки.
Отметим, что директива
#include
обрабатывается препроцессо-
ром рекурсивно. То есть, если подставленный фрагмент текста
содержит другую директиву
#include
, то она также обрабатыва-
ется препроцессором.
В файлах, которые подключаются к исходному тексту программы
директивой
#include
, обычно хранятся объявления внешних гло-
бальных переменных и функций. Поэтому такие файлы называ-
ются
заголовочными файлами
(header files) и имеют расшире-
ние h.
Сложные программы могут включать несколько заголовочных
файлов. Поэтому возможно многократное включение в текст про-
граммы содержимого одного и того же заголовочного файла.
Глава 9. Директивы препроцессора
129
Чтобы предотвратить такую ситуацию, обычно в заголовочный
файл ставят "часового". Например, заголовочный файл может
начинаться с такого текста:
#if !defined MY_NAME
#define MY_NAME
/* здесь содержимое заголовочного файла */
#endif /* MY_NAME */
В этом случае содержимое заголовочного файла будет вставлять-
ся в текст программы только в том случае, если в ней не опреде-
лено символическое имя
MY_NAME
.
9.6. Директивы
#error
Директива
#error
предписывает препроцессору прекратить обра-
ботку текста программы и выдать сообщение об ошибке. Эта ди-
ректива имеет следующий синтаксис:
#error сообщение
Здесь
сообщение
представляет собой произвольный текст. На-
пример:
#ifndef VERSION
#error Vesrsion is not defined
#endif
9.7. Директива
#line
Директива
#line
предписывает препроцессору изменить номер
текущей строки и имя компилируемого файла. Эта директива
имеет следующий синтаксис:
#line номер_строки "имя_файла"
где
номер_строки
— константа, которая устанавливает новый но-
мер для текущей строки в обрабатываемом исходном файле, а
имя_файла
задает новое имя файла для компилируемого файла.
Например:
#line 50 "user.c"
Часть I. Язык программирования С
130
9.8. Директива
#pragma
Директива
#pragma
предписывает компилятору выполнить неко-
торое действие. Можно также сказать, что эта директива предна-
значена для определения других директив препроцессора, кото-
рые зависят от реализации и версии компилятора. Директива
#pragma
имеет следующий синтаксис:
#pragma директива
Здесь
директива
представляет собой предопределенную инструк-
цию для компилятора, которая является произвольным текстом.
Например, следующие директивы соответственно выключают и
включают оптимизацию кода в компиляторе Visual С++ фирмы
Microsoft:
#pragma optimize("", off)
#pragma optimize("", on)
9.9. Пустая директива
Если строка в программе содержит единственный символ
#
, то
это не вызовет никаких действий препроцессора. В этом случае за
символом
#
следует пустая директива. Например:
#ifdef MAX
#
#else
#define MAX 255
#endif
9.10. Оператор
#
Оператор
#
используется в макрокомандах с одним параметром,
для преобразования этого параметра в символьную строку языка
программирования С. Такая макрокоманда имеет следующий
вид:
#define имя(параметр) шаблон