我有一个包含全局变量的模块。要声明一些全局变量,我需要使用 HDF5。我也在使用一个库,所以我还需要包含一个头文件。所以 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是在头文件中定义的数据类型,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
问题1:编译器在编译IO.F90时返回错误,说Vec是未定义的数据类型。但它并没有抱怨HID_T。我认为 global_variables 模块已经包含 HDF5 模块和头文件,使用 IO.F90 中的 global_variables 模块将处理每个数据类型声明,但似乎没有。你能帮我理解我理解错了吗?
问题2:有没有办法将#include的效果限制在声明它的模块上?
PS。如果我包含#include "finclude/petscvec.h"
在声明Vec的 IO.F90 中,那么它编译得很好。