C / C ++ библиотека непрозрачных указателей - PullRequest
3 голосов
/ 25 апреля 2010

Есть ли уже написанная библиотека / заголовок для управления объектами C ++ из C с помощью непрозрачных указателей / дескрипторов?

Я могу написать сам, но я бы предпочел использовать уже готовое решение, особенно если оно имеет привязки к фортрану.

мои конкретные требования:

  • Средство генерации оболочки (я думаю, использовать препроцессор Boost)
  • обработка объектов с помощью целочисленных (а не необработанных указателей) дескрипторов (в виде mpi) для обеспечения проверки дескриптора и специальных значений и некоторой переносимости с 64-битным фортраном.

Спасибо

Ответы [ 2 ]

4 голосов
/ 25 апреля 2010

В C ++ просто предоставьте функции

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(); }

и заголовок C

extern void * get_foo();
extern void * create_foo();

Все, что вам нужно, должны быть соответствующие приспособления с отливками в void*.

Ваш компилятор Fortran может быть совместим с extern "C" (особенно если он совместим со статическими библиотеками C) или ваш компилятор C ++ может иметь extern "Fortran". Смотрите их руководства.

Возможно, вам удастся найти генератор кода, который сделает это за вас. Если вы можете, делать это вручную безопаснее, конечно.

0 голосов
/ 25 апреля 2010

Если у вас есть интерфейс, похожий на C, для привязки Fortran, вероятно, вы можете использовать привязку ISO C, чтобы указать компилятору Fortran, как вызывать интерфейс C. Как правило, привязка ISO C обеспечивает стандартный и переносной метод взаимодействия Fortran & C в обоих направлениях, хотя некоторые функции обоих языков не поддерживаются. Ниже приведен пример интерфейса, который может (не проверен) работать для настройки привязки Fortran:

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
...