2016-12-06 61 views
0

我有正在生成一个动态库.F90文件中的以下工作状况(在Windows DLL,所以在Linux上):使用IFDEF的给了一个属性

#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行产生错误:

(error #5082: Syntax error, found END-OF-STATEMENT when expecting one of: ::/ bind(c, name='TEST')

+0

您是否尝试过#ifdef(s)内的SUBROUTINE? – Holmz

+0

这不是Fortran 90,标签已移除。 –

+0

@Holmz他确定他做了,看问题中的第一个代码块。 –

回答

0

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

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

的问题是,你需要以某种方式继续线在Windows情况下也并没有我可以看到的选择。

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

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

+0

感谢提示,你是完全正确的;实际上我不需要'iso_c_binding',而在Windows中我需要'!DEC $ ATTRIBUTES DLLEXPORT',所以我不能使用'bind(C)'。 我解决了使用'!DEC $ ATTRIBUTES DECORATE,ALIAS“TEST”:: TEST' for Linux和'!DEC $ ATTRIBUTES DLLEXPORT,DECORATE,ALIAS“TEST”:: TEST' for Windows。 感谢您的帮助 –

+0

据我所知'!DEC $ ATTRIBUTES DLLEXPORT'可以和'bind(C)'结合使用。 –

+0

你说的没错,'bind(C)'不能与'ALIAS'或'DECORATE'结合...顺便说一句,我已经解决了问题,就像我上面写的那样...我应该删除这个问题? –

相关问题