我在我的fortran代码中使用m4来生成基于我的参数文件中定义的标志的特定代码。
我知道预处理很少,因此不太了解M4。我正在尝试编写代码,我需要根据三种情况定义事物:等温,正压,两者都没有。我写了以下代码:
#ifdef isothermal
do something (1)
#elif barotropic
do something (2)
#else
do something (3)
#endif
现在当我编译代码时,它使用等温[do something(1)]和(没有等温和正压定义)编译得很好[做某事(3)]。但是当我定义正压时,它会回到[做某事(3)]而不是[做某事(2)]。
关于如何在m4中处理这种情况的任何指示?
谢谢!
答案 0 :(得分:2)
在一次贬低和评论的刺激下,我看到我对这个问题的理解是有缺陷的。所以我下载了m4
并重新修改了我的答案。嵌套的ifdef()
似乎可以解决问题:
ifdef(`isothermal',do something (1),ifdef(`barotropic',do something (2),do something (3)))
将其保存在文件triplecond.f中并使用m4
进行处理:
$ m4 triplecond.f do something (3) $ m4 -Disothermal triplecond.f do something (1) $ m4 -Dbarotropic triplecond.f do something (2) $
答案 1 :(得分:0)
m4不是cpp!
#ifdef是C预处理器功能。 ifdef(name,string,optional string)是m4版本。
答案 2 :(得分:0)
我也在找这个,最后自己写了一个。这是我维基上代码的链接:
http://www.eugeneweb.com/wiki/Sites/M4Macros
我定义了不带# 的名称,例如。 IF、ELSE、ENDIF 等...此外,M4 还需要括号来保存 CPP(大部分)没有的参数。我还添加了一个选择性调用,以保护具有副作用的宏免受未选定块中的调用。