[英]Fortran module combine with procedure being accessed in C and vice versa
[英]importing interface module procedure from fortran into C
我應該如何使用extern
將fortran interface
導入C?
假設我有以下fortran模塊:
!swapper module
module swapper
interface swap
module procedure swap_r, swap_i, swap_c
end interface
contains
!subroutine implementations here:
!swap_r takes two double precision as argument
!swap_i takes two integers as argument
!swap_c takes two characters as argument
end module swapper
那么我可以在C語言中執行以下操作嗎?
extern "C" void __swapper_MOD_swap(double*, double*)
extern "C" void __swapper_MOD_swap(int*, int*)
extern "C" void __swapper_MOD_swap(char*, char*)
或者,如果我承諾僅使用雙精度數字來調用swap
,我可以專門這樣做嗎?
extern "C" void __swapper_MOD_swap(double*, double*)
看來您實際上在使用C ++。 但是首先讓我們為C或C風格的C ++回答:
不,你不能
extern "C" void __swapper_MOD_swap(double*, double*)
您無法針對三種不同類型的參數執行此操作,即使對於單一類型的參數也無法執行此操作。
實際上,庫中首先應該沒有任何__swapper_MOD_swap
。
Fortran所做的是,它為三個特定的子例程swap_r, swap_i, swap_c
保留了一個接口(這只是如何調用某事物的描述) swap_r, swap_i, swap_c
並允許您通過名稱swap
調用。
但是模塊中沒有實際的子例程swap
!!! Fortran僅會讓您用不同的名稱來稱呼這三個細節,僅此而已。
沒有辦法像通用一樣從C調用這些函數。 C沒有這種類型的泛型! (它確實具有一些可以使用void*
進行任何類型操作的功能)。
在C ++中,您實際上可以制作專用於不同類型的泛型,並且可以將Fortran過程稱為泛型,但是您必須自己告訴C ++! 您可以制作一個模板並手動對其進行特殊化處理,以調用相應的extern "C"
函數。
有關示例,請參見我的頭文件https://github.com/LadaF/PoisFFT/blob/master/src/poisfft.h ,在此我創建了一個C ++類,該類鏈接到extern "C" struct
和一些extern "C"
函數但是,所有這些都在Fortran中實現。
最后,請勿使用__swapper_MOD_
符號。 使用bind(C,name="some_name")
創建一些Fortran綁定bind(C,name="some_name")
並通過extern "C"
調用some_name
,因為不同的Fortran編譯器some_name
使用不同的名稱處理方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.