M4 pushdef внутри другого макроса - PullRequest
0 голосов
/ 08 мая 2018
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 во время оценки __expose_method, чтобы получить желаемый результат?

1 Ответ

0 голосов
/ 09 мая 2018

Единственный способ реализовать это поведение - использовать функцию patsubst следующим образом:

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

Кажется, это клейкая лента.

...