Длина строки в препроцессоре 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