8.1.8报价原则

综上所述,引用经验法则是:

每对括号一对引号。

不要过度引用,不要少引用,尤其是在宏。在宏需要使用括号的少数地方(通常在C程序文本或正则表达式中),正确引用论据!

阅读包含以下代码段的Autoconf程序很常见:

AC_TRY_链接(更改引用(<<,>>)dnl<<#include<time.h>#ifndef tzname/*对于SGI*/外部字符*tzname[];/*RS6000和其他拒绝char**tzname*/#endif>>,changequote([,])dnl[atoi(*tzname);],ac_cv_var_tzname=是,ac_cv_var_tzname=否)

这是非常无用的,因为AC_TRY_链接已经双引号,所以您只需要:

AC_TRY_链接([#include<时间.h>#ifndef tzname/*对于SGI*/外部字符*tzname[];/*RS6000和其他拒绝char**tzname*/#endif]中,[atoi(*tzname);],[ac_cv_var_tzname=yes],[ac_cv_var_tzname=否])

M4级的读者可能会注意到这两个示例非常严格等效,因为M4吞下了更改引号(<<,>>)和'<<’ ‘>>'当它收集参数:这些引号不是参数的一部分!

简单地说,上面的示例就是这样做的:

更改引用(<<,>>)dnl<<[]>>changequote([,])dnl

而不是简单地:

[[]]

对于不双引号引用其参数的宏(即规则),双引号(风险)文字:

AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include<time.h>#ifndef tzname/*对于SGI*/外部字符*tzname[];/*RS6000和其他拒绝char**tzname*/#结束]],[atoi(*tzname);]),[ac_cv_var_tzname=yes],[ac_cv_var_tzname=否])

请注意,宏AC_TRY_链接已经过时了,所以你真的应使用AC_LINK_IFELSE公司而不是。

请参阅象形图如果你遇到无望的情况该怎么办引用是不够的。

当您创建配置使用新编写的宏编写脚本,仔细检查,以检查是否需要在中添加更多引号宏。如果M4中有一个或多个单词消失输出,您需要更多的引号。如有疑问,请引用。

然而,也有可能添加太多的引号层。如果发生这种情况,结果配置脚本可能包含未展开的宏。这个自动配置文件程序检查此问题通过查找字符串'交流_中的'配置然而,这启发式通常不起作用:例如,它不能捕获在中引用过多AC_定义描述。