File: autoconf.info, Node: Particular Headers, Next: Generic Headers, Prev: Header Portability, Up: Header Files
5.6.2 Particular Header Checks
------------------------------
These macros check for particular system header files--whether they
exist, and in some cases whether they declare certain symbols.
-- Macro: AC_CHECK_HEADER_STDBOOL
Check whether ‘stdbool.h’ exists and conforms to C99 or later, and
cache the result in the ‘ac_cv_header_stdbool_h’ variable. If the
type ‘_Bool’ is defined, define ‘HAVE__BOOL’ to 1.
This macro is obsolescent, as all current C compilers have
‘stdbool.h’, a header that is itself obsolescent as of C23.
This macro is intended for use by Gnulib (*note Gnulib::) and other
packages that supply a substitute ‘stdbool.h’ on platforms lacking
a conforming one. The ‘AC_HEADER_STDBOOL’ macro is better for code
that explicitly checks for ‘stdbool.h’.
-- Macro: AC_HEADER_ASSERT
Check whether to enable assertions in the style of ‘assert.h’.
Assertions are enabled by default, but the user can override this
by invoking ‘configure’ with the ‘--disable-assert’ option.
-- Macro: AC_HEADER_DIRENT
Check for the following header files. For the first one that is
found and defines ‘DIR’, define the listed C preprocessor macro:
‘dirent.h’ ‘HAVE_DIRENT_H’
‘sys/ndir.h’ ‘HAVE_SYS_NDIR_H’
‘sys/dir.h’ ‘HAVE_SYS_DIR_H’
‘ndir.h’ ‘HAVE_NDIR_H’
The directory-library declarations in your source code should look
something like the following:
#include
#ifdef HAVE_DIRENT_H
# include
# define NAMLEN(dirent) strlen ((dirent)->d_name)
#else
# define dirent direct
# define NAMLEN(dirent) ((dirent)->d_namlen)
# ifdef HAVE_SYS_NDIR_H
# include
# endif
# ifdef HAVE_SYS_DIR_H
# include
# endif
# ifdef HAVE_NDIR_H
# include
# endif
#endif
Using 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.
This macro is obsolescent, as all current systems with directory
libraries have ‘’. New programs need not use this macro.
Also see ‘AC_STRUCT_DIRENT_D_INO’ and ‘AC_STRUCT_DIRENT_D_TYPE’
(*note Particular Structures::).
-- Macro: AC_HEADER_MAJOR
Detect the headers required to use ‘makedev’, ‘major’, and ‘minor’.
These functions may be defined by ‘sys/mkdev.h’, ‘sys/sysmacros.h’,
or ‘sys/types.h’.
‘AC_HEADER_MAJOR’ defines ‘MAJOR_IN_MKDEV’ if they are in
‘sys/mkdev.h’, or ‘MAJOR_IN_SYSMACROS’ if they are in
‘sys/sysmacros.h’. If neither macro is defined, they are either in
‘sys/types.h’ or unavailable.
To properly use these functions, your code should contain something
like:
#include
#ifdef MAJOR_IN_MKDEV
# include
#elif defined MAJOR_IN_SYSMACROS
# include
#endif
Note: Configure scripts built with Autoconf 2.69 or earlier will
not detect a problem if ‘sys/types.h’ contains definitions of
‘major’, ‘minor’, and/or ‘makedev’ that trigger compiler warnings
upon use. This is known to occur with GNU libc 2.25, where those
definitions are being deprecated to reduce namespace pollution. If
it is not practical to use Autoconf 2.70 to regenerate the
configure script of affected software, you can work around the
problem by setting ‘ac_cv_header_sys_types_h_makedev=no’, as an
argument to ‘configure’ or as part of a ‘config.site’ site default
file (*note Site Defaults::).
-- Macro: AC_HEADER_RESOLV
Checks for header ‘resolv.h’, checking for prerequisites first. To
properly use ‘resolv.h’, your code should contain something like
the following:
#ifdef HAVE_SYS_TYPES_H
# include
#endif
#ifdef HAVE_NETINET_IN_H
# include /* inet_ functions / structs */
#endif
#ifdef HAVE_ARPA_NAMESER_H
# include /* DNS HEADER struct */
#endif
#ifdef HAVE_NETDB_H
# include
#endif
#include
-- Macro: AC_HEADER_STAT
If the macros ‘S_ISDIR’, ‘S_ISREG’, etc. 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.
This macro is obsolescent, as no current systems have the bug. New
programs need not use this macro.
-- Macro: AC_HEADER_STDBOOL
If ‘stdbool.h’ exists and conforms to C99 or later, define
‘HAVE_STDBOOL_H’ to 1; if the type ‘_Bool’ is defined, define
‘HAVE__BOOL’ to 1.
This macro is obsolescent, as all current C compilers have
‘stdbool.h’, a header that is itself obsolescent as of C23.
Nowadays programs that need ‘bool’, ‘true’ and ‘false’ can include
‘stdbool.h’ unconditionally, without using ‘AC_HEADER_STDBOOL’, and
if such a program needs to be portable only to C23 or later it need
not even include ‘stdbool.h’.
This macro caches its result in the ‘ac_cv_header_stdbool_h’
variable.
This macro differs from ‘AC_CHECK_HEADER_STDBOOL’ only in that it
defines ‘HAVE_STDBOOL_H’ whereas ‘AC_CHECK_HEADER_STDBOOL’ does
not.
-- Macro: AC_HEADER_STDC
This macro is obsolescent. Its sole effect is to make sure that
all the headers that are included by ‘AC_INCLUDES_DEFAULT’ (*note
Default Includes::), but not part of C89, have been checked for.
All hosted environments that are still of interest for portable
code provide all of the headers specified in C89 (as amended in
1995).
-- Macro: AC_HEADER_SYS_WAIT
If ‘sys/wait.h’ exists and is compatible with Posix, define
‘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 compatible,
then instead of including it, define the Posix macros with their
usual interpretations. Here is an example:
#include
#ifdef HAVE_SYS_WAIT_H
# include
#endif
#ifndef WEXITSTATUS
# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
#endif
#ifndef WIFEXITED
# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
#endif
This macro caches its result in the ‘ac_cv_header_sys_wait_h’
variable.
This macro is obsolescent, as current systems are compatible with
Posix. New programs need not use this macro.
‘_POSIX_VERSION’ is defined when ‘unistd.h’ is included on Posix
systems. If there is no ‘unistd.h’, it is definitely not a Posix
system. However, some non-Posix systems do have ‘unistd.h’.
The way to check whether the system supports Posix is:
#ifdef HAVE_UNISTD_H
# include
# include
#endif
#ifdef _POSIX_VERSION
/* Code for Posix systems. */
#endif
-- Macro: AC_HEADER_TIOCGWINSZ
If the use of ‘TIOCGWINSZ’ requires ‘’, then define
‘GWINSZ_IN_SYS_IOCTL’. Otherwise ‘TIOCGWINSZ’ can be found in
‘’.
Use:
#ifdef HAVE_TERMIOS_H
# include
#endif
#ifdef GWINSZ_IN_SYS_IOCTL
# include
#endif