我在.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')
答案 0 :(得分:0)
嗯,这是可能的,但你必须使用Fortran规则进行续行
subroutine FCCORR (i1,i2) &
#ifdef __linux__
bind(c, name='FCCORR')
问题是你需要在Windows案例中以某种方式继续行,并且没有我能看到的选项。
但我不明白为什么你也不能在Windows中使用bind(C)
属性。
use, intrinsic :: iso_c_binding
,因为代码中没有对模块的引用。如果代码需要它,那么在Windows版本中也需要它。