在fortran子例程中包含一个c / c ++头文件

时间:2013-01-31 15:30:49

标签: c header include fortran

我有一个用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]”等等其他变量......

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

这一行

#define pastix_uint_t      unsigned INTEGER(kind=4)

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