1

我有一个包含全局变量的模块。要声明一些全局变量,我需要使用 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 中,那么它编译得很好。

4

1 回答 1

3

语法

Vec vector

Fortran 完全陌生。它之所以有效,只是因为 Vec 是在头文件“finclude/petscvec.h”中定义为的 C 预处理器 (CPP) 宏

#define Vec PetscFortranAddr

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

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

除了逆向工程最终预处理器所做的事情之外,您可能无能为力,但我不会那样做,它可能是不可移植的。

于 2016-02-20T11:26:01.060 回答