自动配置手册指出,注释行可以以dnl或#开头。
它们之间有什么区别吗,有什么理由在任何情况下使用一种而不是另一种?或者这纯粹是品味的问题?
发布于 2010-07-31 18:29:51
在configure.ac中,在AC_INIT之后出现的带有'#‘注释的行将出现在生成的配置脚本中。dnl注释不会。dnl的一个目的是丢弃不需要的换行符,以使配置脚本可读。此外,使用dnl注释来记录m4宏也是合适的;这些注释在配置脚本中没有任何意义,因为m4宏不会出现在那里,只出现在它的展开部分。
Makefile.am中的注释以不同的方式处理。Makefile.am不是由m4处理的,而是由automake处理的,automake的约定是丢弃以##开头且前面只有空格的行。(尽管###注释传递到Makefile.in)因为Makefile.am不是由m4处理的,所以'dnl‘不引入注释。
发布于 2010-07-30 20:12:05
dnl是一个m4宏,它会丢弃同一行(包括换行符)上跟在它后面的所有输入。#在m4中没有任何意义,所以它最终出现在目标(Makefile?)中,在目标中它充当注释。
因此,关键的区别在于dnl是原始源文件中的注释,而#则成为生成的文件中的注释。
发布于 2021-11-02 09:16:34
正如其他人所指出的:对于configure.ac中的所有内容,即configure.ac文件的“注释”,使用dnl;对于要进入结果配置脚本的所有内容,则使用#。这里有一件很重要的事情:dnl阻止所有的解析(唯一的例外是dnl(,可以在下面的例子中看到:
# CHECKME: possibly drop AM_PROG_AR + build_aux/ar-lib
AM_PROG_AR
LT_INIT([dlopen win32-dll])由autoconf处理后将导致
可能未定义的宏: AM_PROG_AR如果此标记和其他标记是合法的,请使用m4_pattern_allow。请参阅Autoconf文档。
而
dnl CHECKME: possibly drop AM_PROG_AR + build_aux/ar-lib
AM_PROG_AR
LT_INIT([dlopen win32-dll])效果很好。
学到的教训:永远不要在#之后使用宏(对于使用最终配置脚本的用户来说,这在任何情况下都没有意义),并且在大多数情况下在configure.ac中使用dnl。另请参阅Comments in m4 input。
https://stackoverflow.com/questions/3371239
复制相似问题