【问题标题】:How do I call GNU m4 nested function?如何调用 GNU m4 嵌套函数?
【发布时间】:2020-07-19 20:19:48
【问题描述】:

我正在尝试在宏中定义一个条件宏并将其作为选项传递,到目前为止我有:

ma​​in.m4

changequote([,])

define([FUNCTION_CALL],[$1    $2    $3])

然后我做:

basic.m4

ifdef([SECURITY],
    FUNCTION_CALL([foo],[bar],[baz])
  )

FUNCTION_CALL([foo2],[bar2],[baz3]

并调用 m4 -DSECURITY main.m4 basic.m4

我想要什么:

  • 删除结果文件中条件行和无条件行之间出现的所有空格

  • 以某种方式将 ifdef 调用包装到 FUNCTION_CALL_IF 函数中,这样我就不必一直编写 ifdef 块。

【问题讨论】:

  • 也许您可以在行尾使用dnl

标签: templates macros gnu m4


【解决方案1】:

您需要将dnl 放在行尾,否则换行符将被复制到输出中。所以,例如:

ifdef([SECURITY],dnl
FUNCTION_CALL([foo],[bar],[baz])dnl
)dnl

还要注意我选择不缩进FUNCTION_CALL——否则缩进空间也会被复制到输出中。另一种方法是使用引号字符来创建用于缩进的无用空字符串:

ifdef([SECURITY],dnl
[][]FUNCTION_CALL([foo],[bar],[baz])dnl
)dnl

不过,我不确定是否可以习惯这一点。

关于你的第二个问题,创建一个FUNCTION_CALL_IF 宏:

define([FUNCTION_CALL_IF],[ifdef([$1],[FUNCTION_CALL([$2],[$3],[$4])])])

我不确定FUNCTION_CALL 的用途是什么(它只是在其参数之间添加空格?),但这将有条件地调用它并且可以像FUNCTION_CALL_IF([SECURITY], [foo], [bar], [baz]) 一样使用

【讨论】:

    【解决方案2】:

    M4 读取其输入并在执行过程中扩展宏调用。除某些情况外,空白字符仅被复制到输出。请阅读 M4 文档以了解基础知识。

    话虽如此,你的问题还不清楚。

    每个参数前面的未加引号的空白字符被丢弃,并且输出转移到带有负数的流被丢弃(如下所示)。

    divert(`-1')
    changequote(`[',`]')
    define([FUNCTION_CALL], [$1    $2    $3])
    divert[]dnl
    ifdef([SECURITY], 
    
      [FUNCTION_CALL([foo],[bar],[baz])],
    
            [FUNCTION_CALL([foo2],[bar2],[baz3])])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 2021-11-07
      • 2015-03-18
      • 1970-01-01
      • 2018-03-13
      • 2011-07-21
      • 2012-02-07
      相关资源
      最近更新 更多