在 中m4
,是否可以展开宏并立即将其放在引号中?也就是说,而不是
define(HELLO, `Hello!')dnl
define(MACRO, `HELLO')dnl
MACRO
扩展到Hello!
,我希望有一些功能qexpand
,例如
define(HELLO, `Hello!')dnl
define(MACRO, `HELLO')dnl
qexpand(`MACRO')
扩展到HELLO
.但是,当然,前两行之后扩展为字符串的任何其他行MACRO
也可以。
背景。我想使用 ,patsubst
比如说在其中替换逗号来对宏的扩展进行替换。很遗憾
define(`MACRO',`x,y,z')dnl
patsubst(`MACRO',`,',`.')
产生x,y,z
,因为替换是在字符串上执行的MACRO
。但如果宏的扩展包含逗号,则变体
define(`MACRO',`x,y,z')dnl
patsubst(MACRO,`,',`.')
第二行首先扩展为patsubst(x,y,z,`,',`.')
,给出错误Warning: excess arguments to builtin `patsubst' ignored
。将宏扩展为引号的可能性可以解决这个问题。
答案1
defn()
是你的qexpand()
职能。
define(HELLO, `Hello!')dnl
define(MACRO, `HELLO')dnl
defn(`MACRO')
将输出HELLO
, 和
define(`MACRO',`x,y,z')dnl
patsubst(defn(`MACRO'),`,',`.')
会输出x.y.z
.
defn()
返回其每个参数的引用定义。在上面的第二个示例中,我们使用它来获取带引号的字符串x,y,z
( 的带引号的值MACRO
)。然后将其移交给patsubst
它将逗号更改为点。
POSIX 标准m4
关于这个宏有这样的说法:
defn
宏的定义文本
defn
应为其参数的引用定义(使用当前引用字符串)。如果 defn 后面没有紧跟着 a<left-parenthesis>
,则行为未指定。
对于 BSD 来说m4
,defn()
宏已记录作为
defn(name, ...)
返回每个参数的引用定义。这可用于重命名宏定义(甚至对于内置宏)。
GNUm4
有(在m4
info
文档),
内置:
defn (NAME...)
扩展到引用的定义每个
NAME
。如果参数不是已定义的宏,则该参数的扩展为空。如果
NAME
是用户定义的宏,则引用的定义只是引用的扩展文本。相反,如果只有一个NAME
并且它是内置函数,则扩展是一个特殊标记,它指向内置函数的内部定义。该标记仅作为define
(andpushdef
) 的第二个参数才有意义,并且在大多数其他上下文中会默默地转换为空字符串。不支持将内置函数与其他任何内容相结合;会发出警告,并且最终扩展中会省略内置函数。宏
defn
只能通过参数来识别。