编写生成dotgraph notation的M4递归宏遇参数异常问题求助
M4宏问题修复方案
故障原因
你的实现出错的核心是没有遵循M4的引号规则,导致非数字参数被错误展开:
- 定义
first临时宏时,宏名和赋值内容都没有加M4引号(左引号,右引号'),非数字的字符串参数会被M4当作宏尝试二次展开,最终导致first`的值被覆盖 - 递归调用
$0(shift($*))没有加引号包裹,M4会提前展开递归调用的参数,打乱参数传递顺序 - 递归结束后没有清除
first临时宏,多次调用时会出现变量污染
修复后代码
define(`coachExisting', ` `'ifdef(`first', , define(`first', `$1'))`' ifelse(eval($# == 2), 1, `first -> $2; undefine(`first')', `first -> $2; `$0'(shift($@))' )')
验证效果
- 调用
coachExisting(a, b, c, d),输出结果为a -> b; a -> c; a -> d;,符合预期 - 调用
coachExisting(1, 2, 3, 4),输出结果为1 -> 2; 1 -> 3; 1 -> 4;,兼容原有数字参数场景
内容的提问来源于stack exchange,提问作者GreenAndKind49371
相关产品推荐
相关产品推荐

