5.2.2. Директива '#else'
Директива '#else' может использоваться в условной конструкции для
предоставления альтернативного кода программы втом случае, если условие
ложно. Вот как это выглядит:
#if EXPRESSION
TEXT-IF-TRUE
#else /* Not EXPRESSION */
TEXT-IF-FALSE
#endif /* Not EXPRESSION */
Если значение EXPRESSION является ненулевым и используется код
TEXT-IF-TRUE, то директива '#else' рассматривается как ложное условие и
код TEXT-IF-FALSE игнорируется. И наоборот, если условие '#if' - ложно,
то включается код TEXT-IF-FALSE.
5.2.3. Директива '#elif'
Обычное применение однородных условий связано с проверкой более чем
двух возможных вариантов. Например:
#if X == 1
...
#else /* X != 1 */
#if X == 2
...
#else /* X != 2 */
...
#endif /* X != 2 */
#endif /* X != 1 */
Дополнительная директива '#elif' позволяет это сократить как рассмотрено
ниже.
#if X == 1
...
#elif X == 2
...
#else /* X != 2 and X != 1*/
...
#endif /* X != 2 and X != 1*/
Директива '#elif' означает "иначе если" ("else if"). Также как и
'#else', она помещается в середину конструкции '#if'-'#endif' и подразделяет
ее. Ей не требуется наличия собственной директивы '#endif'. Также как и
'#if', директива '#elif' включает в себя тестируемое выражение.
Текст, следующий за директивой '#elif' включается только в том случае,
когда значение изходящей директивы '#if' - ложно, а условие '#elif' - верно.
В одной конструкции '#if'-'#endif' может использоваться более чем одна
директива '#elif'. Текст после директивы '#elif' включается только в том
случае, когда условие '#elif' - верно и находится после условия '#if' или
предшествующего '#elif', значения которых - ложь. '#else' является
эквивалентом директивы '#elif 1', а '#else' может следовать после
любого количества директив '#elif', в то время как '#elif' не может
следовать за '#else'.
5.3. Сохранение удаленного кода для дальнейших ссылок
Если часть программы была перемещена или удалена, но есть необходимость
в сохранении старого кода в качестве комментария для дальнейших ссылок к
нему, то простейший способ реализации этого заключается в использовании
конструкции '#if 0'-'#endif', внутри которой находится этот код. Это
рациональнее применения обычных комментариев, так как это не всегда
помогает, если этот код также содержит комментарии.
Такая конструкция в любом случае будет безошибочной, даже если
заключенный в нее текст также содержит условия (полные конструкции '#if'-
'#endif').
Однако не следует применять такую конструкцию, если комментируемый
текст не является С кодом. Для этого используются обычные С комментарии.
Директива '#if 0' должна состоять из правильных лексем.
5.4. Условия и макросы
Условия часто используются вместе с макросами или утверждениями, так
как они являются единственными выражениями, чьи значения могут варьироваться
при компиляции. Директива '#if', не использующая макросы или утверждения,
является эквивалентом директиве '#if 1' или '#if 0'.
Например, рассмотрим условие, проверяющее выражение 'BUFSIZE == 1020',
где 'BUFSIZE' является макросом.
#if BUFSIZE == 1020
printf ("Large buffers!\n");
#endif /* BUFSIZE is large */
При программировании часто требуется определить размер переменной или
тип данных в директиве '#if', но препроцессор не обрабатыват такие операторы
как 'sizeof' или ключевые слова как 'int'.
В директиве '#if' применяется специальный оператор 'defined',
используемый для проверки соответствия указанного имени существующему
макросу. В любом случае, значением выражения 'defined NAME' или
'defined (NAME)' является 1, если в данном месте программы определен макрос
с именем NAME, в противном случае значением выражения будет 0. Для оператора
'defined' имеет значение не определение макроса, а то что оно есть.
Рассмотрим пример:
#if defined (vax) || defined (ns16000)
Здесь значением выражения будет истина, если как имя 'vax', так и
'ns16000' определены как макросы. То же самое можно выполнить с помощью
утверждений:
#if #cpu (vax) || #cpu (ns16000)
Если макрос был определен, а затем уничтожен с помощью директивы
'#undef', то последующее применение оператора 'defined' возвратит значение
0, так как это имя больше не определено. Если же макрос заново определен
директивой '#define', то оператор 'defined' возвратит значение 1.
Условия, проверяющие определение одного имени довольно часто
используются, поэтому для этой цели существует две дополнительные условные
директивы.
'#ifdef NAME'
что является эквивалентом '#if defined (NAME)'.
'#ifndef NAME'
что является эквивалентом '#if ! defined (NAME)'.
Макроопределения могут меняться при разных процессах компиляции по
некоторым причинам.
Некоторые макросы являются заранее определенными, в зависимости от
типа используемого компьютера. Например, на компьютерах Vax, имя 'vax'
является заранее определенным макросом. На других компьютерах оно не
определено.
Большое количество макросов определяется системными подключаемыми
файлами. На различных системах и компьютерах определяются разные макросы с
разными значениями. Очень часто полезно проверять эти макросы условными
конструкциями во избежание использования аппаратных возможностей на
компьютере, где они не реализованы.
Макросы являются простым способом настройки пользователями программы
для различных систем или приложений. Например, макрос 'BUFSIZE' может быть
определен в конфигурационном файле программы, который вкючается в качестве
подключаемого файла в каждый исходный файл. Можно использовать макрос
'BUFSIZE' в условии препроцессора для генерации кода, зависящего от
выбранной конфигурации.
Макросы могут определяться или уничтожаться с помощью опций
препроцессора '-D' и '-U' при компиляции программы. Можно сделать так, что
один и тот же исходный файл будет скомпилирован в две различные программы
путем определения нужного макроса, использования условий для проверки
значения этого макроса и передачи значения макроса через опции компилятора.
Утверждения обычно являются заранее определенными, но они также могут
быть определены с помощью директив или опций препроцессора.
... 1-12. Напишите программу, печатающую гистограмму длин слов из файла ввода. Самое легкое - начертить гистограмму горизон- тально; вертикальная ориентация требует больших усилий. 1.7. Функции. В языке “C” функции эквивалентны подпрограммам или функ- циям в фортране или процедурам в PL/1, паскале и т.д. Функ- ции дают удобный способ заключения некоторой части вычисле- ний в черный ...
... , сложны для понимания и абсолютно непрозрачны, а возможности существенно уступают Форту и Лиспу. В общем, муть и мрак. Вавилонское столпотворение Всякий раз, когда появляется очередной новый язык, о котором говорят, как об «окончательном и безальтернативном», предрекая скорую смерть всех остальных, мне становится смешно. Сам по себе язык в отрыве от среды программирования —малоинтересен, да и все ...
... программе. В данном разделе они перечислены в алфавитном порядке и приводятся с объяснениями. Эти ошибки могут являться следствием случайного затирание памяти программой. Abnormal program termination Аварийное завершение программы Данное сообщение может появляться, если для выполнения программы не может быть выделено достаточного количества памяти. Более подробно оно рассматривается в конце ...
... доступа с записью равной байту. Такие файлы называются двоичными. Файлы прямого доступа незаменимы при написании программ, которые должны работать с большими объемами информации, хранящимися на внешних устройствах. В основе обработке СУБД лежат файлы прямого доступа. Кратко изложим основные положения работы с файлами прямого доступа. 1). Каждая запись в файле прямого доступа имеет свой номер ...
0 комментариев