如何从 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 了解详细信息,但您可能会发现选项 -E
将 foo.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
.
提供预处理器符号。
我有一个小的 Fortran 程序,其中包含一些写在 *.F90 文件中的预处理器指令。现在,我想从中生成一个 *.f90 fortran 文件,删除 *.F90 文件中与其他未激活指令对应的所有额外代码。
在 pgifortran 中,我所要做的就是:
pgf90 -F file_name.F90
就是这样!它生成一个 *.f90 文件,其中包含与活动指令相关的行。
我如何在 gfortran 中执行此操作?
GNU Fortran 选项
请参阅 https://gcc.gnu.org/onlinedocs/gfortran/Preprocessing-Options.html 了解详细信息,但您可能会发现选项 -E
将 foo.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
.