PETSC header #include'd 在模块中

PETSC header #include'd in a module

我有一个包含全局变量的模块。要声明一些全局变量,我需要使用 HDF5。我也在使用一个库,所以我还需要包含一个 header 文件。所以global_variable.F90的序言是这样的。

module global_variables

use HDF5
#include "finclude/petscsys.h"
#include "finclude/petscvec.h"

integer(HID_T) id_file
integer(HID_T) id_plist
Vec M, C, K
...

end module

Vec是header文件中定义的数据类型,HID_T是定义的数据类型在 HDF5 模块中。

现在,我有一个文件,其中包含 I/O 的子例程。此文件还使用 HDF5 和 global_variables.F90 中使用的相同库。所以 IO.F90 看起来像这样。

module io

use global_varibles

contains

subroutine read_input_file( vector )

Vec vector
integer HDF5err

call H5open_f( HDF5err )
...

end subroutine

end module

问题一:编译器returns编译IO.F90时出错,说Vec是未定义的数据类型。但它不会抱怨HID_T。我认为 global_variables 模块已经包含 HDF5 模块和 header 文件,在 IO.F90 中使用 global_variables 模块将处理每个数据类型声明,但似乎没有。你能帮我理解我理解错了什么吗?

问题2:有没有办法限制#include 对声明它的模块的影响?

PS。如果我在 IO.F90 中包含 #include "finclude/petscvec.h",它声明 Vec,那么它编译得很好。

语法

Vec vector

对于 Fortran 来说是完全陌生的。它之所以起作用,是因为 Vec 是头文件 "finclude/petscvec.h" as

中定义的 C 预处理器 (CPP) 宏
#define Vec PetscFortranAddr

这意味着 您必须在每个 Fortran 文件中包含头文件,您在其中使用上述语法和 Vec。无法使用 Fortran use 继承宏,因为它不是 Fortran 的一部分。

PetscFortranAddr 最后在 "finclude/petscdef.h" 中定义为 4 或 8 字节的整数,具体取决于您的系统。

除了对预处理器最终实现的结果进行逆向工程外,您可能无能为力,但我不会那样做,它可能不可移植。