M4 pushdef在另一个宏上下文中

时间:2018-05-08 15:05:32

标签: macros m4

TrashFragment

我希望脚本会产生如下输出:

define(`__for_each', 
    `ifelse(`$#', `1', `', `$#', `2', `$1(`$2')', 
`$1(`$2')__for_each(`$1', shift(shift($@)))')')dnl
define(`__method_decl', `virtual $2 $1() = 0;')
define(`__expose_method', `pushdef(`method', `__method_decl')$1 popdef(`method')')dnl
define(`interface', ``struct' $1 { 
__for_each(`__expose_method', shift($@))
};')dnl
interface(iface, 
    method(ma, int), 
    method(mb, void))

但它不是struct iface { virtual int ma() = 0; virtual void mb() = 0; }; 而是返回行空间填充的行。 如何在virtual int ma() = 0; virtual void mb() = 0;评估时定义宏method以获得所需的输出?

1 个答案:

答案 0 :(得分:0)

我发现实现此行为的唯一方法是以下一种方式使用patsubst函数:

define(`__expose_method', `patsubst(`$1', `method', `__method_decl')')dnl

好像是胶带。