コンパイルされない次のコードがあります。 FortranインターフェイスをC++でオーバーロードされた関数として呼び出すことは可能ですか?以下で試してみますか?C++からFortranインターフェイスを呼び出すことは可能ですか
これは、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++コンパイラにmangleという名前のC ABIを使用するように求められます。簡単な解決策は、関数に2つのわずかに異なる名前を使用することです。また、C ABIの参照を渡すことはおそらくうまくいかないでしょう。 –
2つの名前のバージョンはすでに動作しています(参照渡しも含みます)。これを避けることができるのであれば私は興味がありました。 – Chiel