Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4123

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Часть 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 символическое_имя 
    исходный_код 

Здесь 

исходный_код

  включается  в  текст  программы  при  условии, 

что  определено 

символическое_имя

.  Заканчивается  фрагмент  ис-


background image

Глава 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 символическое_имя 

Здесь 

имя_файла

  должно  быть  символьной  строкой,  определяю-

щей путь к файлу. 


background image

Часть 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. 
Сложные  программы  могут  включать  несколько  заголовочных 
файлов. Поэтому возможно многократное включение в текст про-
граммы  содержимого  одного  и  того  же  заголовочного  файла. 


background image

Глава 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" 


background image

Часть 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 имя(параметр) шаблон 


Смотрите также файлы