如何从 gfortran 中的 *.F90 文件生成 *.f90 文件?

How to generate *.f90 files from *.F90 files in gfortran?

我有一个小的 Fortran 程序,其中包含一些写在 *.F90 文件中的预处理器指令。现在,我想从中生成一个 *.f90 fortran 文件,删除 *.F90 文件中与其他未激活指令对应的所有额外代码。

在 pgifortran 中,我所要做的就是:

pgf90 -F file_name.F90

就是这样!它生成一个 *.f90 文件,其中包含与活动指令相关的行。

我如何在 gfortran 中执行此操作?

GNU Fortran 选项

请参阅 https://gcc.gnu.org/onlinedocs/gfortran/Preprocessing-Options.html 了解详细信息,但您可能会发现选项 -Efoo.F90 预处理为 stdout(当然,您可以将其通过管道传输到例如foo.f90).

-E 选项通常对 GNU 编译器 front-ends 有效,对 C、C++ 和 Fortran 有效。

虽然默认情况下对扩展名为 .fpp.FPP.F.FOR.FTN、[=25= 的文件启用预处理]、.F95.F03.F08,您可以使用 -cpp 手动启用它。您也可以使用 -nocpp.

手动禁用它

示例程序

      program main
      implicit none
#ifdef USER_MACRO
      print*,'USER_MACRO was defined'
#endif
#ifdef __GFORTRAN__
      print*,'I am GNU Fortran (aka gfortran)!'
#endif
#ifdef __GNUC__
      print*,'I am GNU C (or its preprocessor)!'
#endif
      end program main

来自 GNU C 预处理器的结果 (cpp)

$ cpp -E fpp.F90 
# 1 "fpp.F90"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 324 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "fpp.F90" 2
      program main
      implicit none







      print*,'I am GNU C (or its preprocessor)!'

      end program main

来自 GNU Fortran 的结果

$ gfortran -E fpp.F90 
# 1 "fpp.F90"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "fpp.F90"
      program main
      implicit none




      print*,'I am GNU Fortran (aka gfortran)!'


      print*,'I am GNU C (or its preprocessor)!'

      end program main

显然,您也可以看到 user-defined 符号是如何预处理的:

$ gfortran -E -DUSER_MACRO fpp.F90 
# 1 "fpp.F90"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "fpp.F90"
      program main
      implicit none

      print*,'USER_MACRO was defined'


      print*,'I am GNU Fortran (aka gfortran)!'


      print*,'I am GNU C (or its preprocessor)!'

      end program main

来自英特尔 Fortran 的结果

如果有兴趣,英特尔编译器支持与 GCC 相同的选项:

$ ifort -E -DUSER_MACRO fpp.F90 
# 1 "fpp.F90"
      program main
      implicit none

      print*,'USER_MACRO was defined'

# 8

# 11

      end program main

使用 IBM XL Fortran 进行预处理

IBM XL Fortran 手册页包含完整的详细信息,但重要的是要注意,必须通过 -WF,-DUSER_MACRO 而不是 -DUSER_MACRO.

提供预处理器符号。