如何获得不同类型的模块以进行代码重用?

How to get a module with different type for code reuse?

现在我有两个模块。两个模块的功能完全一样,只是一个是处理实型,另一个是处理复型。所有这些模块都将在一个程序中使用,因此根据不同的参数输入,我们需要选择不同的模块。

根据"code reuse"的主要精神,如何把这些模块做成一份代码。这些模块需要高性能(因此需要避免使用 "if"、"select" 之类的东西)。请问有什么解决办法吗?

这是下一个(2020 年?)Fortran 标准的争论话题。在当前版本中无法对 Fortran 模块进行参数化。许多人认为它是一个大缺陷(参见 comp.lang.fortran 的讨论)。

您可以做的是使用预处理器(通常是 C 预处理器)并包含文件。您在包含文件中将类型定义为宏名称

  MYTYPE :: x

然后您包含具有适当定义的文件

#define MYTYPE real
#include "module-template.F90"
#undef MYTYPE

#define MYTYPE complex
#include "module-template.F90"
#undef MYTYPE

您通过

启用预处理器
 gfortran -cpp
 ifort -fpp

和类似的(参见编译器手册)。

示例(我写的)可以在包含文件中看到

https://github.com/LadaF/PoisFFT/blob/master/src/fft-inc.f90

包含在

https://github.com/LadaF/PoisFFT/blob/master/src/fft.f90

正如您在示例中看到的那样,其中有一些优点。您需要两个模块具有不同的名称,例如 mod_realmod_complex。您可以像示例一样执行此操作,也可以使用宏链接来生成模块名称。参见 C preprocessor macro: concatenation (example for Fortan90) and