在我尝试使用 ifort 之前,我对与 gfortran 配合良好的构造感到非常满意。虽然我从未见过它清楚地记录在案。我刚试过,它奏效了。我很好奇如何调整以下示例,以便 ifort 11.1 可以咀嚼它。
module A
use iso_c_binding
implicit none
interface
function foo(x) bind(C, name="strlen")
use, intrinsic :: iso_c_binding
character(c_char), intent(in) :: x
integer(c_size_t) :: foo
end function foo
end interface
end module A
module B
use A
! use A, foo0 => foo
implicit none
interface foo
module procedure foo1
procedure foo
end interface foo
contains
function foo1(x)
real, intent(in) :: x
real :: foo1
foo1 = 2. * x
end function foo1
end module B
program C
use B
implicit none
write (*,*) foo(C_CHAR_"Hello" // C_NULL_CHAR)
write (*,*) foo(2.)
end program C
这是我收到的错误消息
tst.f90(20): error #6643: This statement is incorrectly positioned.
procedure foo0
-----^
tst.f90(20): error #8168: Parentheses are required after the PROCEDURE keyword.
procedure foo0
-----^
它是 GNU 扩展吗?-pedantic
不抱怨。它像我期望的那样工作
5
4.00000000
我是否必须在接口 foo 中详细编写 foo0 声明?
更新 2013-03-31
我调整了上面的示例代码以包含bind(C)
. 由于它位于 中,因此即使与 gfortran 一起interface
使用也无法使用。module
对于之前不恰当的精简示例误导我深表歉意。
另一个更新 2013-03-31
显然ifort version 13.1.1
不支持这样的构造(无论我是否将 foo 重命名为 foo0 )
tst.f90(22): error #6623: The procedure name of the INTERFACE block conflicts with a name in the encompassing scoping unit. [FOO]
procedure foo
---------------^
tst.f90(22): error #8574: A procedure-name in a generic interface block must be a nonintrinsic procedure that has an explicit interface. [FOO]
procedure foo
---------------^
如果我module
在程序之前添加,我会得到
tst.f90(22): error #7950: Procedure name in MODULE PROCEDURE statement must be the name of accessible module procedure. [FOO]
module procedure foo
----------------------^
除非我在所有细节中再次明确声明该 bind(C) 接口,否则目前似乎无法做我想做的事:(