Anycorn
Anycorn

Reputation: 51465

C/C++ opaque pointer library

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

Answers (2)

M. S. B.
M. S. B.

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

Potatoswatter
Potatoswatter

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

Related Questions