【发布时间】:2016-12-06 12:55:26
【问题描述】:
我在生成动态库(Windows 中的 DLL,Linux 中的 SO)的 .f90 文件中有以下工作情况:
#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: 语法错误,在期望 END-OF-STATEMENT 时发现 的: :: / 绑定(c, name='TEST')
【问题讨论】:
-
你试过#ifdef(s)里面的SUBROUTINE吗?
-
这不是 Fortran 90,标记已删除。
-
@Holmz 确定他做到了,请参阅问题中的第一个代码块。