Как вызвать вложенную функцию GNU m4?

Я пытаюсь определить условный макрос внутри макроса и передать его как вариант, пока у меня есть:

main.m4

changequote([,])

define([FUNCTION_CALL],[$1    $2    $3])

тогда я делаю:

базовый.m4

ifdef([SECURITY],
    FUNCTION_CALL([foo],[bar],[baz])
  )

FUNCTION_CALL([foo2],[bar2],[baz3]

и вызовите m4 -DSECURITY main.m4 basic.m4

Что я хочу:

  • удалить все пробелы, возникающие в результирующем файле между условными и безусловными строками

  • каким-то образом перенесите вызовы ifdef в функцию FUNCTION_CALL_IF, чтобы мне не приходилось постоянно писать блоки ifdef.


person M.Mass    schedule 19.07.2020    source источник
comment
Может быть, вы хотите использовать dnl в конце строк?   -  person uzsolt    schedule 20.07.2020


Ответы (2)


Вам нужно поставить dnl в конце строк, иначе новые строки будут скопированы в вывод. Так, например:

ifdef([SECURITY],dnl
FUNCTION_CALL([foo],[bar],[baz])dnl
)dnl

Также обратите внимание, что я решил не делать отступ FUNCTION_CALL, иначе пробелы отступа также будут скопированы в вывод. Альтернативой является использование символов кавычек для создания бесполезных пустых строк для отступов:

ifdef([SECURITY],dnl
[][]FUNCTION_CALL([foo],[bar],[baz])dnl
)dnl

Хотя я не уверен, что к этому можно привыкнуть.

Что касается вашего второго вопроса, создание макроса FUNCTION_CALL_IF:

define([FUNCTION_CALL_IF],[ifdef([$1],[FUNCTION_CALL([$2],[$3],[$4])])])

Я не совсем уверен, для чего предназначен FUNCTION_CALL (он просто добавляет пробелы между своими аргументами?), но это вызовет его условно и может использоваться как FUNCTION_CALL_IF([SECURITY], [foo], [bar], [baz])

person markasoftware    schedule 11.09.2020

M4 считывает ввод и расширяет вызовы макросов по ходу дела. Пробельные символы просто копируются в вывод, за исключением некоторых случаев. Пожалуйста, прочитайте документацию M4, чтобы узнать основы.

При этом ваша проблема не ясна.

Символы пробела без кавычек, предшествующие каждому аргументу, отбрасываются, а вывод перенаправляется в поток с отрицательным числом (как вы можете видеть ниже).

divert(`-1')
changequote(`[',`]')
define([FUNCTION_CALL], [$1    $2    $3])
divert[]dnl
ifdef([SECURITY], 

  [FUNCTION_CALL([foo],[bar],[baz])],

        [FUNCTION_CALL([foo2],[bar2],[baz3])])
person Community    schedule 18.02.2021