Go to the first, previous, next, last section, table of contents.
These macros check for particular system header files--whether they exist, and in some cases whether they declare certain symbols.
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 #endifUsing the above declarations, the program would declare variables to be of type
struct dirent
, not struct direct
, and would access
the length of a directory entry name by passing a pointer to a
struct dirent
to the NAMLEN
macro.
This macro also checks for the SCO Xenix `dir' and `x' libraries.
major
, minor
, and
makedev
, but `sys/mkdev.h' does, define
MAJOR_IN_MKDEV
; otherwise, if `sys/sysmacros.h' does, define
MAJOR_IN_SYSMACROS
.
S_ISDIR
, S_ISREG
et al. defined in
`sys/stat.h' do not work properly (returning false positives),
define STAT_MACROS_BROKEN
. This is the case on Tektronix UTekV,
Amdahl UTS and Motorola System V/88.
STDC_HEADERS
if the system has ANSI C header files.
Specifically, this macro checks for `stdlib.h', `stdarg.h',
`string.h', and `float.h'; if the system has those, it
probably has the rest of the ANSI C header files. This macro also
checks whether `string.h' declares memchr
(and thus
presumably the other mem
functions), whether `stdlib.h'
declare free
(and thus presumably malloc
and other related
functions), and whether the `ctype.h' macros work on characters
with the high bit set, as ANSI C requires.
Use STDC_HEADERS
instead of __STDC__
to determine whether
the system has ANSI-compliant header files (and probably C library
functions) because many systems that have GCC do not have ANSI C
header files.
On systems without ANSI C headers, there is so much variation that
it is probably easier to declare the functions you use than to figure
out exactly what the system header files declare. Some systems contain
a mix of functions ANSI and BSD; some are mostly ANSI but
lack `memmove'; some define the BSD functions as macros in
`string.h' or `strings.h'; some have only the BSD
functions but `string.h'; some declare the memory functions in
`memory.h', some in `string.h'; etc. It is probably
sufficient to check for one string function and one memory function; if
the library has the ANSI versions of those then it probably has
most of the others. If you put the following in `configure.ac':
AC_HEADER_STDC AC_CHECK_FUNCS(strchr memcpy)then, in your code, you can put declarations like this:
#if STDC_HEADERS # include <string.h> #else # if !HAVE_STRCHR # define strchr index # define strrchr rindex # endif char *strchr (), *strrchr (); # if !HAVE_MEMCPY # define memcpy(d, s, n) bcopy ((s), (d), (n)) # define memmove(d, s, n) bcopy ((s), (d), (n)) # endif #endifIf you use a function like
memchr
, memset
, strtok
,
or strspn
, which have no BSD equivalent, then macros won't
suffice; you must provide an implementation of each function. An easy
way to incorporate your implementations only when needed (since the ones
in system C libraries may be hand optimized) is to, taking memchr
for example, put it in `memchr.c' and use
`AC_REPLACE_FUNCS(memchr)'.
HAVE_SYS_WAIT_H
. Incompatibility can occur if `sys/wait.h'
does not exist, or if it uses the old BSD union wait
instead
of int
to store a status value. If `sys/wait.h' is not
POSIX.1 compatible, then instead of including it, define the
POSIX.1 macros with their usual interpretations. Here is an
example:
#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
_POSIX_VERSION
is defined when `unistd.h' is included on
POSIX.1 systems. If there is no `unistd.h', it is definitely
not a POSIX.1 system. However, some non-POSIX.1 systems do
have `unistd.h'.
The way to check if the system supports POSIX.1 is:
#if HAVE_UNISTD_H # include <sys/types.h> # include <unistd.h> #endif #ifdef _POSIX_VERSION /* Code for POSIX.1 systems. */ #endif
TIME_WITH_SYS_TIME
. On some older systems,
`sys/time.h' includes `time.h', but `time.h' is not
protected against multiple inclusion, so programs should not explicitly
include both files. This macro is useful in programs that use, for
example, struct timeval
or struct timezone
as well as
struct tm
. It is best used in conjunction with
HAVE_SYS_TIME_H
, which can be checked for using
AC_CHECK_HEADERS(sys/time.h)
.
#if TIME_WITH_SYS_TIME # include <sys/time.h> # include <time.h> #else # if HAVE_SYS_TIME_H # include <sys/time.h> # else # include <time.h> # endif #endif
TIOCGWINSZ
requires `<sys/ioctl.h>', then
define GWINSZ_IN_SYS_IOCTL
. Otherwise TIOCGWINSZ
can be
found in `<termios.h>'.
Use:
#if HAVE_TERMIOS_H # include <termios.h> #endif #if GWINSZ_IN_SYS_IOCTL # include <sys/ioctl.h> #endif
Go to the first, previous, next, last section, table of contents.