是否可以从C 调用FORTRAN接口

Is it possible to call a Fortran interface from C++

本文关键字:调用 FORTRAN 接口 是否      更新时间:2023-10-16

i具有以下代码未编译的代码。是否可以将Fortran接口称为C 中的重载函数,就像我在下面尝试的?

这是Fortran代码:

module functions
    use, intrinsic :: iso_c_binding, only : c_double, c_int
    implicit none
    interface increment bind(c, name="increment")
        module procedure increment_int, increment_double
    end interface
contains
    subroutine increment_int(a, b)
        integer(c_int), intent(inout) :: a
        integer(c_int), value :: b
        a = a + b
    end subroutine
    subroutine increment_double(a, b)
        real(c_double), intent(inout) :: a
        real(c_double), value :: b
        a = a + b
    end subroutine
end module functions

这是C 代码:

#include <iostream>
namespace
{
    extern "C" void increment(int&, int);
    extern "C" void increment(double&, double);
}
int main()
{
    int a = 6;
    const int b = 2;
    double c = 6.;
    const int d = 2.;
    increment(a, b);
    increment(c, d);
    std::cout << "a = " << a << std::endl;
    std::cout << "c = " << c << std::endl;
    return 0;
}

不,无法避免。但是您可以实例化模板调用两个。或者只是为这两个外部C函数制作C 通用包装器。您绝对不能使Fortran导出界面。接口只是一个描述,如何在Fortran中内部以某些名称调用两个子例程。

这个问题将接口模块过程从fortran导入到C中非常相似。我什至最初以重复的方式关闭了你的,但后来我改变了主意,因为尝试的解决方案略有不同。

但是原理是一样的。Fortran仿制药和C 仿制药不兼容。并且您之间的C没有类似类型的通用物。

注意:正如@RichardCritten的建议,您也不应在extern C函数中通过参考。编译器可能对其进行编译,并以逐值传递指针,但不能保证它。只需通过指针即可。有关更多信息,请参见C 的参考参数和C链接。