Reputation: 51465
Is there library/header already written to manage C++ objects from C using opaque pointers/handles?
I can write one myself, but I would rather use already made solution, especially if it has fortran bindings.
my specific requirements are:
Thanks
Upvotes: 3
Views: 1182
Reputation: 29391
Once you have an interface that looks like C, for the Fortran binding probably you can use the ISO C Binding to instruct the Fortran compiler how to call the C interface. Generally the ISO C Binding provides a standard & portable method of interfacing Fortran & C in both directions, though there are some features of both languages that aren't supported. The following is an example interface that might (untested) work to setup a Fortran binding:
module my_fortran_binding
use iso_c_binding
implicit none
interface get_foo_interf
function get_foo () bind (C, name="get_foo")
import
type (C_PTR) :: get_foo
end function get_foo
end interface get_foo_interf
interface create_foo_interf
etc....
end create_foo_interf
end module my_fortran_binding
Upvotes: 0
Reputation: 137810
In C++, simply provide functions
Foo foo; // C++ object we want to access
Foo &foo_factory(); // C++ function we want to call
extern "C" void * get_foo() // extern "C" so C can call function
{ return (void *) & foo; } // cast it to an opaque void * so C can use it
extern "C" void * create_foo()
{ return (void *) & foo_factory(); }
and a C header
extern void * get_foo();
extern void * create_foo();
Appropriate accessors with casts to and from void*
should be all you need.
Your Fortran compiler may be compatible with extern "C"
(particularly if it's compatible with C static libraries) or your C++ compiler may have extern "Fortran"
. See their manuals.
You might be able to find a code generator to do this for you. If you can, doing it manually is safer of course.
Upvotes: 4