簡體   English   中英

將接口模塊過程從fortran導入C

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM