我有一个包含全局变量的模块。要声明一些全局变量,我需要使用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。如果我在IO.F90中包含#include "finclude/petscvec.h"
,它声明 Vec ,那么它编译得很好。
答案 0 :(得分:3)
语法
#define Vec PetscFortranAddr
与Fortran完全不同。它的工作原理只是因为Vec是头文件“finclude / petscvec.h”中定义的C预处理器(CPP)宏
Vec
这意味着您必须在每个Fortran文件中包含头文件,其中您使用上述语法use
。使用Fortran PetscFortranAddr
无法继承宏,因为它不是Fortran的一部分。
{{1}}最终在“finclude / petscdef.h”中定义为4或8字节的整数,具体取决于您的系统。
除了逆向工程预处理器最终的功能之外,你可能无能为力,但我不会这样做,它可能是不可移植的。