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 字节的整数,具体取决于您的系统。
除了对预处理器最终实现的结果进行逆向工程外,您可能无能为力,但我不会那样做,它可能不可移植。
我有一个包含全局变量的模块。要声明一些全局变量,我需要使用 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 字节的整数,具体取决于您的系统。
除了对预处理器最终实现的结果进行逆向工程外,您可能无能为力,但我不会那样做,它可能不可移植。