gfortran中的条件编译

6
我想知道是否有可能选择不同部分来编译我的Fortran 95例程。
例如,如果我向gfortran传递某些标志,编译器将选择用于某个函数的哪个部分。我知道可以在例程内部使用if来实现这一点,但缺点是由于速度问题,我不希望程序始终运行if。我想解决方案应该类似于这个
我特别需要与计算许多体系能量(比如说一百万个)的程序配合工作。然后,我不希望每次需要在编译时使用不同的能量定义时都要放置一个if
我希望这是可能的,也希望我的问题很清楚。
1个回答

3
您可以使用类C的预处理器。将-cpp命令行选项添加到您的命令行中。该选项默认未开启(根据下面Vladimir F的评论),但看起来使用.F90文件扩展名(即大写的F,而不是.f90)可以避免使用-cpp选项。

有关该选项的详细信息:

https://gcc.gnu.org/onlinedocs/gfortran/Preprocessing-Options.html

然后您可以像您指出的那样进行操作,因此:

#ifdef <some-var>
  code when <some-var> is true
#elif defined(<other-var>)
  code when <other-var> is true
#endif

根据要求。

这个网页有更多的实际代码示例

另外,就像C/C++一样,您可以使用-D选项在命令行上定义宏:

gfortran -DCASE1=3 ...

这将使用值3定义CASE1。如果您未指定值,则宏自动分配为1。该页面上有说明文档。


1
使用cpp预处理器非常完美。我之前不知道这个存在。非常感谢,Alexis! - Nando
1
我认为 #elsif 是一个打字错误,应该改成 #elif - s.ouchene
扩展名应该用大写字母编写(即F90而不是.f90)。这是大多数编译器自动知道它们应该预处理代码的方式(引用自您帖子中的第二个链接)。 - s.ouchene
我将两个注释都应用到了我的答案中。#elsif 很好地捕捉到了问题。此外,你需要使用 defined() 来等效于 #ifdef - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接