2016-12-06 60 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'結合...順便說一句,我已經解決了問題,就像我上面寫的那樣...我應該刪除這個問題? –

相關問題