Тройная условная проверка с ifdef в M4

Я использую m4 в своем коде на Фортране для генерации определенного кода на основе флагов, определенных в моем файле параметров.

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

#ifdef isothermal
    do something (1)
#elif barotropic
    do something (2)
#else
    do something (3)
#endif

Теперь, когда я компилирую код, он отлично компилируется с изотермическим [сделать что-то (1)] и (без определения изотермического и баротропного) [сделать что-то (3)]. Но когда я определяю баротропный, оно возвращается к [сделать что-то (3)] вместо [сделать что-то (2)].

Любые указатели на то, как справиться с такой ситуацией в m4?

Спасибо!


person toylas    schedule 27.09.2013    source источник


Ответы (3)


Вдохновленный отрицательным голосом и комментарием, я вижу, что мое понимание вопроса было ошибочным. Поэтому я скачал m4 и переработал свой ответ. Вложенный ifdef(), похоже, делает свое дело:

ifdef(`isothermal',do something (1),ifdef(`barotropic',do something (2),do something (3)))

Сохраняем это в файл threecond.f и обрабатываем с помощью m4:

$ m4 triplecond.f 
do something (3)

$ m4 -Disothermal triplecond.f 
do something (1)

$ m4 -Dbarotropic triplecond.f 
do something (2)

$ 
person Digital Trauma    schedule 28.09.2013

m4 НЕ является cpp!

#ifdef — это функция препроцессора C. ifdef(имя, строка, необязательная строка) — это версия m4.

person Demi    schedule 07.12.2013

Я тоже искал это и в итоге написал свой собственный. Вот ссылка на код на моей вики:

http://www.eugeneweb.com/wiki/Sites/M4Macros

Я определил имена без #, например. IF, ELSE, ENDIF и т. д. Также M4 требует, чтобы круглые скобки содержали аргументы, в которых CPP (в основном) не используется. Я также добавил выборочный вызов для защиты макросов с побочными эффектами от вызова в невыбранном блоке.

person Mr Clif    schedule 08.04.2021