由其他的宏调用的宏将被m4进行几次求值;每次求值都可能需要一层引号以防止对宏或者m4 内置宏的不必要扩展,例如说define'和$1’。引号还需要出现在含有逗号的宏参数中, 这是因为逗号把参数与参数分隔开来。还有,把所有含有新行和调用其它宏的宏参数引起来是一个好主意。

Autoconf把m4的引用字符从缺省的'和`''改为`['和`]', 这是因为许多宏使用‘和'',这不方便。然而,在少数情况下,宏需要使用方括号(通常在C程序文本 或者常规表达式中)。在这些情况下,它们使用m4内置命令changequote暂时地把引用字符改为<<’和`>>’。 (有时,如果它们不需要引用任何东西,它们就通过把引用字符设置成空字符串以完全关闭引用。)下面是一个例子:

AC_TRY_LINK(
changequote(<<, >>)dnl
<<#include <time.h>

#ifndef tzname /* For SGI. /
extern char *tzname[]; /
RS6000 and others reject char **tzname. */

#endif>>,
changequote([, ])dnl
[atoi(*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)
当你用新编写的宏创建configure脚本时,仔细地验证它以检查你是否需要在你的宏之中添加更多的引号。 如果一个或多个单词在m4的输出中消失了,你就需要更多的引号。当你不能确定的时候,就使用引号。

但是,还有放置了过多层的引号的可能。如果这发生了,configure脚本的结果将包含未扩展的宏。 程序autoconf通过执行`grep AC_ configure’来检查这个问题。