@anchor{Particular Headers}
Эти макросы выполняют проверку отдельных заголовочных файлов--- существуют ли они и, в некоторых случаях, объявлены ли в них какие-либо символы.
SYS_SIGLIST_DECLARED, если переменная
sys_siglist объявлена в системном заголовочном файле--- либо
в `signal.h', либо в `unistd.h'.
AC_HEADER_DIRENT и
AC_FUNC_CLOSEDIR_VOID, но определяет немного другой набор макросов
препроцессора C, для указания того, какой заголовочный файл найден. Этот
макрос и имена, которые он определяет, считаются устаревшими. Макрос
определяет следующие имена:
DIRENT
SYSNDIR
SYSDIR
NDIR
Вдобавок, если функция closedir не возвращает информативного
значения, то определяется переменная VOID_CLOSEDIR.
Проверка следующих заголовочных файлов, и для первого файла, который найден и определяет `DIR', определить нижеследующие макросы препроцессора C:
HAVE_DIRENT_H
HAVE_SYS_NDIR_H
HAVE_SYS_DIR_H
HAVE_NDIR_H
В исходном тексте объявления библиотеки каталогов должны выглядеть примерно так:
#if HAVE_DIRENT_H # include <dirent.h> # define NAMLEN(dirent) strlen((dirent)->d_name) #else # define dirent direct # define NAMLEN(dirent) (dirent)->d_namlen # if HAVE_SYS_NDIR_H # include <sys/ndir.h> # endif # if HAVE_SYS_DIR_H # include <sys/dir.h> # endif # if HAVE_NDIR_H # include <ndir.h> # endif #endif
Используя нижеследующие объявления, программа должна объявить переменные с
типом struct dirent, а не struct direct, а доступ к полю
длины имени каталога она должна получать путем передачи указателя на
struct dirent макросу NAMLEN.
Этот макрос также проверяет наличие библиотек `dir' и `x' в SCO Xenix.
major, minor и
makedev, но это делается в `sys/mkdev.h', то определяется
переменная MAJOR_IN_MKDEV; в противном случае, если эти функции
определяются в `sys/sysmacros.h', то определяется переменная
MAJOR_IN_SYSMACROS.
STDC_HEADERS, если система имеет заголовочные файлы
ANSI C. Это макрос проверяет наличие `stdlib.h', `stdarg.h',
`string.h' и `float.h'; если система имеет эти файлы, то,
скорее всего, имеются и остальные заголовочные файлы ANSI C. Этот макрос
также проверяет, что `string.h' объявляет memchr (и поэтому,
скорее всего, еще и другие функции mem), объявляется ли в
`stdlib.h' функция free (и, по видимому, malloc и
другие относящиеся к ним функции), и будут ли макросы из `ctype.h'
работать с символами с установленным старшим битом, как этого требует
ANSI C.
Используйте STDC_HEADERS вместо of __STDC__ для
определения, имеются ли в системе совместимые с ANSI заголовочные файлы
(и, вероятно, функции библиотеки C), поскольку многие системы, имеющие GCC,
не имеют заголовочные файлы ANSI C.
На системах без заголовочных файлов ANSI C существует так много вариантов, что, вероятно, легче объявить используемые вами функции, чем точно определять, какой из заголовочные файлов определяет эти функции. Некоторые системы содержат смесь функций ANSI и BSD; некоторые из них по большей части совместимы с ANSI, но не имеют `memmove'; некоторое определяют функции BSD как макросы в файлах `string.h' или `strings.h'; некоторые из них имеют только функции BSD, но с `string.h'; некоторые объявляют функции работы с памятью в `memory.h', некоторые в `string.h'; и т. п. Скорее всего, достаточно проверить наличие одной функции работы со строками и одной функции работы с памятью; если библиотека имеет ANSI-версии этих функций, то, скорее всего, она имеет и большинство других функций. Вы должны поместить следующий код в `configure.in':
AC_HEADER_STDC AC_CHECK_FUNCS(strchr memcpy)
а затем, в вашем коде вы можете поместить следующие строки:
#if STDC_HEADERS # include <string.h> #else # ifndef HAVE_STRCHR # define strchr index # define strrchr rindex # endif char *strchr (), *strrchr (); # ifndef HAVE_MEMCPY # define memcpy(d, s, n) bcopy ((s), (d), (n)) # define memmove(d, s, n) bcopy ((s), (d), (n)) # endif #endif
Если вы используете функции, которые не имеют эквивалентов в BSD, такие
как memchr, memset strtok или strspn, то
просто макросов будет недостаточно; вы должны предоставить реализацию
каждой из функций. Простой способ подключить ваши реализации только
если они действительно нужны (потому что функции из системной библиотеки
могут быть вручную оптимизированы) --- это, например, поместить
функцию memchr в файл `memchr.c', и использовать макрос
`AC_REPLACE_FUNCS(memchr)'.
HAVE_SYS_WAIT_H. Несовместимость может возникнуть,
если файла `sys/wait.h' не существует, или для сохранения значения
статуса он использует старую BSD-версию union wait вместо
int. Если `sys/wait.h' не является совместимым с POSIX.1, то
вместо его включения определяется макрос POSIX.1 с его обычной
реализацией. Вот пример:
#include <sys/types.h> #if HAVE_SYS_WAIT_H # include <sys/wait.h> #endif #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif
NEED_MEMORY_H, если memcpy, memcmp, и
т. п. не объявлены в файле `string.h' и существует файл
`memory.h'. Этот макрос является устаревшим; вместо него
используйте вызов AC_CHECK_HEADERS(memory.h). Смотрите пример для
AC_HEADER_STDC.
HAVE_UNISTD_H, если в системе имеется файл
`unistd.h'. Этот макрос является устаревшим; вместо него
используйте вызов `AC_CHECK_HEADERS(unistd.h)'.
Для проверки того, что система поддерживает POSIX.1, можно использовать следующий код:
#if HAVE_UNISTD_H # include <sys/types.h> # include <unistd.h> #endif #ifdef _POSIX_VERSION /* Код для систем POSIX.1 */ #endif
_POSIX_VERSION определяется, когда `unistd.h' подключен в
системах, совместимых с POSIX.1. Если файла `unistd.h' не существует,
то, скорее всего, эта система не относится к POSIX.1. Однако некоторые
не-POSIX.1 системы имеют файл `unistd.h'.
Определяет USG, если система не имеет файла `strings.h',
rindex, bzero и т. п. Это означает, что система имеет
`string.h', strrchr, memset и т. п.
Символ USG является устаревшим. Вместо этого макроса смотрите
пример для AC_HEADER_STDC.
Go to the first, previous, next, last section, table of contents.