1

我在我的 fortran 代码中使用 m4 根据我的参数文件中定义的标志生成特定代码。

我对预处理知之甚少,因此不太了解 M4。我正在尝试编写代码,我需要根据三种情况来定义事物:等温、正压,两者都不是。我写了以下代码:

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

现在,当我编译代码时,它可以很好地编译等温 [做某事 (1)] 和(没有定义等温和正压)[做某事 (3)]。但是当我定义正压时,它会退回到 [做某事 (3)] 而不是 [做某事 (2)]。

有关如何在 m4 中处理这种情况的任何指示?

谢谢!

4

3 回答 3

2

在投票和评论的推动下,我发现我对这个问题的理解存在缺陷。所以我下载m4并修改了我的答案。嵌套ifdef()似乎可以解决问题:

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

将其保存在文件 Triplecond.f 中并使用以下命令进行处理m4

$ m4 Triplecond.f
做某事(3)

$ m4 -Disothermal Triplecond.f
做某事(一)

$ m4 -Dbarotropic Triplecond.f
做某事(2)

$
于 2013-09-28T03:59:17.093 回答
0

m4 不是 cpp!

#ifdef 是 C 预处理器功能。ifdef(name, string, optional string) 是 m4 版本。

于 2013-12-07T19:55:34.593 回答
0

我也在找这个,最后写了我自己的。这是我的wiki上的代码链接:

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

我定义了没有# 的名称,例如。IF、ELSE、ENDIF 等...此外,M4 还需要括号来保存 CPP(大部分)不支持的参数。我还添加了一个选择性调用来保护具有副作用的宏在未选择的块中被调用。

于 2021-04-08T17:51:12.193 回答