Fortran CPP 类预处理器的替代方案

An alternative to Fortran CPP-like preprocessors

我正在寻找 Fortran 90 代码中 #ifdef #else #enddef 的替代方法。 有没有另一种方法来控制调用模块时执行哪些 use 语句?我想摆脱复杂系统中的 #include 个文件。

比如我现在有这个

#include "defs.h"
module X
#ifdef Sys
use ....
#else
use ....
#endif
implicit none

snip...
#ifdef Sys
some block of code...
#else
some block of code...
#endif
end module X

在defs.h中定义了Sys。我想找到一种替代方法来使用 defs.h 来控制代码的 #ifdef.... 部分。

感谢对此的任何想法。

我将首先重复评论中提到的内容:真正解决您的实际问题的正确方法是找出使用 FCM 时编译器找不到您希望包含的文件的原因。

为了解决您的具体问题,由于无法成功 include 提供各种定义的给定文件,我们可以改为通过传递给编译器的参数来定义符号。

考虑以下内容,存储在test.fpp

#ifdef Sys
#warning "This messages tells you Sys is defined"
#else
#warning "This messages tells you Sys is NOT defined"
#endif

program test
  implicit none
  write(*,'("For clarity we will now print defined if Sys is defined or not defined if Sys is not defined")')
#ifdef Sys
  write(*,'("Defined")')
#else
  write(*,'("Not defined")')
#endif
end program test

我们可以使用 gfortran -ffree-form test.fpp -o test 编译它。这将产生:

test.fpp:4:2: warning: #warning "This messages tells you Sys is NOT defined" [-Wcpp]
 #warning "This messages tells you Sys is NOT defined"
  ^

并执行 ./test 给出输出

For clarity we will now print defined if Sys is defined or not defined if Sys is not defined
Not defined

如果我们现在使用 gfortran -ffree-form test.fpp -o test -DSys 编译,我们会看到消息

test.fpp:2:2: warning: #warning "This messages tells you Sys is defined" [-Wcpp]
 #warning "This messages tells you Sys is defined"
  ^

和运行 ./test给我们

For clarity we will now print defined if Sys is defined or not defined if Sys is not defined
Defined