包括fortran子例程中的ac / c ++头文件

我有一个用C / C ++编写的库,它的开发人员声明它有一个Fortran接口。 将启用该接口,包括头文件* .h并调用经典子例程。 我想编译我的Fortran程序,也链接该库。 该库已经过测试,可以正常使用。

这是主程序:

! Main program INCLUDE 'pastix_fortran.h' Program TEST IMPLICIT NONE call GO_PASTIX END PROGRAM TEST 

例程GO_PASTIX是

 SUBROUTINE GO_PASTIX IMPLICIT NONE pastix_data_ptr_t :: pastix_data integer :: pastix_comm pastix_int_t :: n, rhs, ia(NCOLS+1), ja(NNZER) pastix_float_t :: avals(NNZER), b(NROWS) pastix_int_t :: perm(NROWS), invp(NROWS), iparm(64) real*8 :: dparm(64) call pastix_fortran(pastix_data,pastix_comm,n,ia,ja,avals,perm,invp,b,rhs,iparm,dparm) END SUBROUTINE 

而在文件pastix_fortran.h中,定义了子例程中使用的变量类型:

 #define PASTIX_INT_KIND 4 #define pastix_int_t INTEGER(kind=4) #define pastix_uint_t unsigned INTEGER(kind=4) #define pastix_data_ptr_t INTEGER(kind=4) #define MPI_PASTIX_INT MPI_INTEGER4 #define pastix_float_t REAL(kind=8) #define MPI_PASTIX_FLOAT MPI_REAL8 

使用VS2010我添加了使用/ fpp预处理文件的选项,我没有忘记添加所有包含目录和文件。 然而,编译器说:

标题行:“警告1警告#5117:错误#预处理器行”

对于fortran子例程:“错误#6404:此名称没有类型,并且必须具有显式类型。[PASTIX_DATA_PTR_T]”等等其余变量…

我该怎么解决这个问题?

显然,该类型的#define未正确处理。 我认为,可能的问题之一是你在Fortran中包含头文件的方式,因为你是通过Fortran语句而不是预处理器指令来实现的 。 因此,可能仅在文件已经过预处理后才包含它。 因此,预处理器无法解析.h文件中的#define选项。

include()语句更改为#include预处理程序指令可以解决问题。

这条线

 #define pastix_uint_t unsigned INTEGER(kind=4) 

将导致大多数Fortran编译器出现问题,因为该语言从未使用此语法或任何其他语法支持无符号整数。 一些exception实现可能支持它们,但它们绝对不是标准的。