5.5. Утверждения
"Утверждения" являются более систематической альтернативой макросам
при создании условий на проверку типа компьютера или системы, используемой
при компиляции программы. Утверждения обычно определены заранее, хотя они
могут быть также определены директивами препроцессора или с помощью опций.
Обычно макросы не классифицируются каким-либо образом по их определению.
Они могут указывать на архитектуру модели компьютера, отдельную модель
компьютера, на операционную систему, ее версию или на специфические
возможности конфигурации. Все это может сочетаться в одном макросе. В
отличие от макросов, утверждения состоят из четко поставленного вопроса и
ответа на него. Вопрос обычно называется "утверждением". Утверждение
выглядит следующим образом:
#PREDICATE (ANSWER)
Для имени PREDICATE следует использовать правильно сформированный
идентификатор. Значением ANSWER может быть любая последоватльность слов.
Здесь все символы являются значимыми, за исключением пробелов, расположенных
в начале и в конце ANSWER. Различия в пробелах в середине значения
игнорируются. Не разрешается использовать символ ')' в значении ANSWER.
Далее приведен пример условия, проверяющего является ли ответ ANSWER
утверждением PREDICATE:
#if #PREDICATE (ANSWER)
Для одного утверждения может существовать несколько ответов. Если ответ
упущен при определении утверждения, то следует проверять, существует ли
у данного утверждения какой-нибудь ответ:
#if #PREDICATE
Большинство проверяемых утверждений являются заранее определенными.
GNU C предоставляет три заранее определенных утверждения: 'system', 'cpu'
и 'machine'. Утверждение 'system' используется для описания типа операционной
системы, 'cpu' - для описания архитектуры компьютера, а 'machine'
предоставляет дополнительную информацию о компьютере. Например, в системе
GNU будут верны следующие утверждения:
#system (gnu)
#system (mach)
#system (mach 3)
#system (mach 3.SUBVERSION)
#system (hurd)
#system (hurd VERSION)
а также возможно и другие. Альтернативные утверждения с более или менее
подробной информацией о версии системы помогут получить ответ на вопрос о
типе операционной системы.
В системе Unix существует утверждение '#system (unix)', а возможно
одно из следующих: `#system (aix)', `#system (bsd)', `#system (hpux)',
`#system (lynx)', `#system (mach)', `#system (posix)', `#system (svr3)',
`#system (svr4)', или `#system (xpg4)' вероятно с последующей информацией
о версии системы.
Другие значения для 'system' это '#system (mvs)' и '#system (vms)'.
Многие Unix С компиляторы предоставляют только один ответ на
утверждение 'system': '#system (unix)', если они вообще используют
утверждения.
Утверждение, ответ которого сосотоит из нескольких слов сильно
отличается от утверждений с ответом из одного слова. Например, утверждение
'system (mach 3.0)' не означает, что 'system (3.0)' - верно. Это также не
всегда означает, что 'system (mach)' тоже верно, но в GNU C последнее
утверждение может быть использовано.
В настоящий момент возможные значения утверждений для 'cpu' являются
'#cpu (a29k)', `#cpu (alpha)', `#cpu (arm)', `#cpu (clipper)', `#cpu
(convex)', `#cpu (elxsi)', `#cpu (tron)', `#cpu (h8300)', `#cpu
(i370)', `#cpu (i386)', `#cpu (i860)', `#cpu (i960)', `#cpu (m68k)',
`#cpu (m88k)', `#cpu (mips)', `#cpu (ns32k)', `#cpu (hppa)', `#cpu
(pyr)', `#cpu (ibm032)', `#cpu (rs6000)', `#cpu (sh)', `#cpu (sparc)',
`#cpu (spur)', `#cpu (tahoe)', `#cpu (vax)', `#cpu (we32000)'.
В С программе можно создавать свои утверждения с помощью директивы
'#assert' следующим образом:
#assert PREDICATE (ANSWER)
(следует заметить отсутствие симола '#' перед PREDICATE.)
При каждом выполнении этой директивы создается новый правильный ответ
для PREDICATE. При утверждении одного ответа предыдущие значения остаются в
силе. Единственный способ удалить утверждение - использовать директиву
'#unassert'. Эта директива имеет такой же систаксис как и '#assert'. Можно
удалить все утверждения для PREDICATE следующим образом:
#unassert PREDICATE
Также имеется возможность добавления или удаления утверждений с
помощью опций при вызове 'gcc' или 'cpp'.
5.6. Директивы '#error' и '#warning'
Директива '#error' вынуждает препроцессор сделать отчет о фатальной
ошибке. Все что следует после '#error' используется для сообщения.
Директива '#error' в теле условия, проверяющего комбинацию параметров,
не до конца поддерживаемых программой, используется для сообщения о
возможной ошибке. Например, если известно, что программа не совсем корректно
выполняется на системе Vax, то можно написать:
#ifdef __vax__
#error Won't work on Vaxen. See comments at get_last_object.
#endif
Если имеется несколько конфигурационных параметров, которые должны
быть указаны соответствующим образом при установке, можно использовать
условия для определения несоответствия и выдать сообщение об ошибке.
Например,
#if HASH_TABLE_SIZE % 2 == 0 || HASH_TABLE_SIZE % 3 == 0 \
|| HASH_TABLE_SIZE % 5 == 0
#error HASH_TABLE_SIZE should not be divisible by a small prime
#endif
Директива '#warning' аналогична директиве '#error', но приводит к тому,
что препроцессор выдает предупреждающее сообщение и продолжает обработку.
Все что, что следует после '#warning' используется для сообщения.
Эту директиву можно использовать в устаревших подключаемых файлах с
указанием на новую версию файла.
... 1-12. Напишите программу, печатающую гистограмму длин слов из файла ввода. Самое легкое - начертить гистограмму горизон- тально; вертикальная ориентация требует больших усилий. 1.7. Функции. В языке “C” функции эквивалентны подпрограммам или функ- циям в фортране или процедурам в PL/1, паскале и т.д. Функ- ции дают удобный способ заключения некоторой части вычисле- ний в черный ...
... , сложны для понимания и абсолютно непрозрачны, а возможности существенно уступают Форту и Лиспу. В общем, муть и мрак. Вавилонское столпотворение Всякий раз, когда появляется очередной новый язык, о котором говорят, как об «окончательном и безальтернативном», предрекая скорую смерть всех остальных, мне становится смешно. Сам по себе язык в отрыве от среды программирования —малоинтересен, да и все ...
... программе. В данном разделе они перечислены в алфавитном порядке и приводятся с объяснениями. Эти ошибки могут являться следствием случайного затирание памяти программой. Abnormal program termination Аварийное завершение программы Данное сообщение может появляться, если для выполнения программы не может быть выделено достаточного количества памяти. Более подробно оно рассматривается в конце ...
... доступа с записью равной байту. Такие файлы называются двоичными. Файлы прямого доступа незаменимы при написании программ, которые должны работать с большими объемами информации, хранящимися на внешних устройствах. В основе обработке СУБД лежат файлы прямого доступа. Кратко изложим основные положения работы с файлами прямого доступа. 1). Каждая запись в файле прямого доступа имеет свой номер ...
0 комментариев