gpt4 book ai didi

c++ - 是否可以从 C++ 调用 Fortran 接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:47 25 4
gpt4 key购买 nike

我有以下无法编译的代码。是否可以在 C++ 中调用 Fortran 接口(interface)作为重载函数,正如我在下面尝试的那样?

这是 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;
}

最佳答案

不,这是无法避免的。但是可以实例化一个模板来调用两者。或者只是为这两个 extern C 函数制作一个 C++ 通用包装器。你绝对不能让 Fortran 导出接口(interface)。接口(interface)只是描述如何在 Fortran 内部以某个名称调用两个子程序。

这个问题importing interface module procedure from fortran into C非常相似。我什至最初将你的作为拷贝关闭,但后来我改变了主意,因为尝试的解决方案略有不同。

但原理是一样的。 Fortran 泛型和 C++ 泛型不兼容。它们之间有 C,没有类似类型的泛型。

注意:正如@RichardCritten 建议的那样,您也不应该在 extern C 函数中通过引用传递。编译器可能会编译它并将其实现为按值传递指针,但不能保证。只是传递一个指针。参见 C++ by-reference argument and C linkage了解更多。

关于c++ - 是否可以从 C++ 调用 Fortran 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44785109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com