Node:Macro Definitions, Next:Macro Names, Up:Writing Autoconf Macros
Autoconf macros are defined using the AC_DEFUN macro, which is
similar to the M4 builtin m4_define macro.  In addition to
defining a macro, AC_DEFUN adds to it some code that is used to
constrain the order in which macros are called (see Prerequisite Macros).
An Autoconf macro definition looks like this:
AC_DEFUN(macro-name, macro-body)
You can refer to any arguments passed to the macro as $1,
$2, etc.  See How to define new macros, for more complete information on writing M4 macros.
Be sure to properly quote both the macro-body and the macro-name to avoid any problems if the macro happens to have been previously defined.
Each macro should have a header comment that gives its prototype, and a
brief description.  When arguments have default values, display them in
the prototype.  For example:
# AC_MSG_ERROR(ERROR, [EXIT-STATUS = 1])
# --------------------------------------
m4_define([AC_MSG_ERROR],
[{ _AC_ECHO([configure: error: $1], 2); exit m4_default([$2], 1); }])
Comments about the macro should be left in the header comment.  Most
other comments will make their way into configure, so just keep
using # to introduce comments.
If you have some very special comments about pure M4 code, comments
that make no sense in configure and in the header comment, then
use the builtin dnl: it causes m4 to discard the text
through the next newline.
Keep in mind that dnl is rarely needed to introduce comments;
dnl is more useful to get rid of the newlines following macros
that produce no output, such as AC_REQUIRE.