views:

186

answers:

2

hello

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:

  • wrapper generation facility (my thought is to use boost preprocessor)
  • handling objects through integer (rather than raw pointers) handles (à la mpi) to provide handle verification and special values and some portability with 64-bit fortran.

Thanks

+4  A: 

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.

Potatoswatter
well, it needs to create/destroy/access C++ object.So it is not quite that simple.
aaa
@aaa: updated, reload the page
Potatoswatter
I will have to think it over. there was some problem doing it before like this, but now I cannot remember what it was. thank you for your answer
aaa
A: 

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
M. S. B.
code base is unfortunately in fortran 77 (and to my surprise with very old fortran iv)
aaa
You must be an employee at Bloomberg
Lance Diduck