Похоже, вы на самом деле используете C++. Но сначала давайте ответим для C или C++ в стиле C:
Нет, вы не можете сделать
extern "C" void __swapper_MOD_swap(double*, double*)
вы не можете сделать это для трех разных типов аргументов, вы не можете сделать это даже для одного типа аргументов.
На самом деле в библиотеке вообще не должно быть __swapper_MOD_swap
.
Что делает Fortran, так это то, что он сохраняет интерфейс (который является просто описанием того, как что-то вызывать) для трех конкретных подпрограмм swap_r, swap_i, swap_c
и позволяет вам вызывать их по имени swap
.
Но в модуле НЕТ реальной подпрограммы swap
!!! Фортран просто позволит вам назвать эти три особенности под другим именем, вот и все.
Невозможно вызвать эти функции из C как универсальный. C не имеет такого типа обобщений! (в нем есть некоторые функции, которые работают с любым типом, использующим void*
).
В C++ вы действительно можете создавать дженерики, специализированные для различных типов, и вы можете вызывать процедуры Fortran как дженерики, но вы должны сами сообщить об этом C++! Вы можете создать шаблон и вручную настроить этот шаблон для вызова соответствующих extern "C"
функций.
Для примера см. мой заголовок https://github.com/LadaF/PoisFFT/blob/master/src/poisfft.h, где я создаю класс C++, связанный с функциями extern "C" struct
и некоторыми функциями extern "C"
, которые, однако, все реализованы на Фортране.
Наконец, НЕ используйте символы __swapper_MOD_
. Создайте некоторую привязку Fortran, используя bind(C,name="some_name")
, и вызовите от some_name
до extern "C"
, потому что разные компиляторы Fortran ДЕЙСТВИТЕЛЬНО используют разные схемы искажения имен.
person
Vladimir F
schedule
14.06.2017
extern "C"
. Вы действительно используете C++? - person Vladimir F   schedule 14.06.2017