如何使用ifort"重新导出"在Fortran模块中重载的现有绑定(C)函数?

mlt*_*mlt 2 fortran fortran-iso-c-binding intel-fortran

我对使用gfortran的构造非常满意,直到我用ifort尝试它.虽然我还没有看到它清楚地记录下来.我只是尝试了它并且它有效.我很好奇,但我怎么能调整以下样本,以便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
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误消息

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
-----^
Run Code Online (Sandbox Code Playgroud)

它是GNU扩展吗?-pedantic不抱怨 它起作用,因为我期望它工作

           5
   4.00000000    
Run Code Online (Sandbox Code Playgroud)

我是否必须在接口foo中写入foo0声明的完整细节?

更新2013-03-31

我调整了上面的示例代码以包含bind(C).既然它存在interface,我module甚至不能使用gfortran.我为以前错误的修剪过的例子误导道歉.

另一个更新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
---------------^
Run Code Online (Sandbox Code Playgroud)

如果我module在程序之前添加,我会得到

tst.f90(22): error #7950: Procedure name in MODULE PROCEDURE statement must be the name of accessible module procedure.   [FOO]
     module procedure foo
----------------------^
Run Code Online (Sandbox Code Playgroud)

它看起来目前不可能做我想要的,除非我在所有细节中再次显式声明bind(C)接口:(

Vla*_*r F 5

它是Fortran 2003的一项功能:

"当指定的模块,则过程-NAME_LIST只能包含模块的程序.当未指定MODULE被,程序-NAME_LIST可以包含过程指针,外部过程,虚设程序,或者模块的程序."

您的版本11.1已过时,当前版本为13,但我不确定它现在是否受支持.

在这种情况下,应该可以使用,module procedure直到您的编译器版本完全支持Fortran 2003:

"如果出现MODULE关键字,则每个过程名称必须是模块过程,并且必须在当前范围内可访问."

来源:IBM XL Fortran手册