Previous: Particular Declarations, Up: Declarations


5.7.2 Generic Declaration Checks

These macros are used to find declarations not covered by the “particular” test macros.

— Macro: AC_CHECK_DECL (symbol, [action-if-found], [action-if-not-found], [includes = ‘AC_INCLUDES_DEFAULT])

If symbol (a function, variable, or constant) is not declared in includes and a declaration is needed, run the shell commands action-if-not-found, otherwise action-if-found. includes is a series of include directives, defaulting to AC_INCLUDES_DEFAULT (see Default Includes), which are used prior to the declaration under test.

This macro actually tests whether symbol is defined as a macro or can be used as an r-value, not whether it is really declared, because it is much safer to avoid introducing extra declarations when they are not needed. In order to facilitate use of C++ and overloaded function declarations, it is possible to specify function argument types in parentheses for types which can be zero-initialized:

          AC_CHECK_DECL([basename(char *)])

This macro caches its result in the ac_cv_have_decl_symbol variable, with characters not suitable for a variable name mapped to underscores.

— Macro: AC_CHECK_DECLS (symbols, [action-if-found], [action-if-not-found], [includes = ‘AC_INCLUDES_DEFAULT])

For each of the symbols (comma-separated list with optional function argument types for C++ overloads), define HAVE_DECL_symbol (in all capitals) to ‘1’ if symbol is declared, otherwise to ‘0’. If action-if-not-found is given, it is additional shell code to execute when one of the function declarations is needed, otherwise action-if-found is executed.

includes is a series of include directives, defaulting to AC_INCLUDES_DEFAULT (see Default Includes), which are used prior to the declarations under test.

This macro uses an M4 list as first argument:

          AC_CHECK_DECLS([strdup])
          AC_CHECK_DECLS([strlen])
          AC_CHECK_DECLS([malloc, realloc, calloc, free])
          AC_CHECK_DECLS([j0], [], [], [[#include <math.h>]])
          AC_CHECK_DECLS([[basename(char *)], [dirname(char *)]])

Unlike the other ‘AC_CHECK_*S’ macros, when a symbol is not declared, HAVE_DECL_symbol is defined to ‘0’ instead of leaving HAVE_DECL_symbol undeclared. When you are sure that the check was performed, use HAVE_DECL_symbol in #if:

          #if !HAVE_DECL_SYMBOL
          extern char *symbol;
          #endif

If the test may have not been performed, however, because it is safer not to declare a symbol than to use a declaration that conflicts with the system's one, you should use:

          #if defined HAVE_DECL_MALLOC && !HAVE_DECL_MALLOC
          void *malloc (size_t *s);
          #endif

You fall into the second category only in extreme situations: either your files may be used without being configured, or they are used during the configuration. In most cases the traditional approach is enough.

This macro caches its results in ac_cv_have_decl_symbol variables, with characters not suitable for a variable name mapped to underscores.

— Macro: AC_CHECK_DECLS_ONCE (symbols)

For each of the symbols (comma-separated list), define HAVE_DECL_symbol (in all capitals) to ‘1’ if symbol is declared in the default include files, otherwise to ‘0’. This is a once-only variant of AC_CHECK_DECLS. It generates the checking code at most once, so that configure is smaller and faster; but the checks cannot be conditionalized and are always done once, early during the configure run.