在M4中使用ifdef进行三次条件检查

时间:2013-09-27 20:20:54

标签: preprocessor m4

我在我的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中处理这种情况的任何指示?

谢谢!

3 个答案:

答案 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(大部分)没有的参数。我还添加了一个选择性调用,以保护具有副作用的宏免受未选定块中的调用。