Длина строки в препроцессоре M4

Итак, с этим простым вводом,

define(foo, len($1)) foo(abcdef)

Я получаю в качестве вывода:

 2

Как я могу получить это, чтобы напечатать 5 вместо? Я не могу понять какую-либо комбинацию цитирования, которая делает len() на самом деле получить значение $1 , abcdef вместо буквальной строки `$1',

Редактировать 1: Фактический рассматриваемый код выглядит примерно так:

define(`FILE', `#' /!\ $1 /!\
`#' ====substr(==============================,0,len($1))====)dnl
FILE(`UTILITY.ASM')

1 ответ

Решение

Недостаточное цитирование len($1) приводит к его немедленной оценке во время шага определения, поэтому foo определяется как 2.

Т.е. это эквивалентно:

define(foo, 2) foo(abcdef)

При полном цитировании, результаты - это то, что вы ожидаете:

define(`foo', `len($1)') foo(`abcdef')
> 6
Другие вопросы по тегам