使用IFDEF提供属性

时间:2016-12-06 12:55:27

标签: dll fortran

我在.f90文件中有以下工作情况:生成动态库(Windows中的DLL,Linux中的SO):

#ifdef __linux__
    subroutine FCCORR (i1,i2) bind(c, name='FCCORR')
    use, intrinsic :: iso_c_binding
#endif
!
#ifdef _WIN32
    subroutine FCCORR (i1,i2)
    !DEC$ ATTRIBUTES DLLEXPORT, DECORATE, ALIAS : "FCCORR" :: FCCORR
    !DEC$ ATTRIBUTES REFERENCE :: i1,i2
#endif
!
integer, intent(in)  :: i1
integer, intent(out) :: i2
!
i2 = i1*3
!
end subroutine

我想知道在两种不同的情况下是否可以避免子程序的分离:特别是我想知道是否可以使用#ifdef来附加仅bind属性,如下所示:

subroutine FCCORR (i1,i2)
#ifdef __linux__
    bind(c, name='FCCORR')
    use, intrinsic :: iso_c_binding
#endif
!
#ifdef _WIN32
    !DEC$ ATTRIBUTES DLLEXPORT, DECORATE, ALIAS : "FCCORR" :: FCCORR
    !DEC$ ATTRIBUTES REFERENCE :: i1,i2
#endif
!
integer, intent(in)  :: i1
integer, intent(out) :: i2
!
i2 = i1*3
!
end subroutine

但显然第3行会产生错误:

  

(错误#5082:语法错误,在期待一个时发现END-OF-STATEMENT   of ::: /       bind(c,name =' TEST')

1 个答案:

答案 0 :(得分:0)

嗯,这是可能的,但你必须使用Fortran规则进行续行

subroutine FCCORR (i1,i2) &
#ifdef __linux__
    bind(c, name='FCCORR')

问题是你需要在Windows案例中以某种方式继续行,并且没有我能看到的选项。

但我不明白为什么你也不能在Windows中使用bind(C)属性。

顺便说一下,我绝对不明白为什么你使用use, intrinsic :: iso_c_binding,因为代码中没有对模块的引用。如果代码需要它,那么在Windows版本中也需要它。