2010-04-25 81 views
3

是否有庫/頭已經寫入來使用不透明指針/句柄從C管理C++對象?C/C++不透明指針庫

我可以自己寫一個,但我寧願使用已經提出的解決方案,特別是如果它具有fortran綁定。

我的具體要求是:

  • 包裝發電設施(我的想法是使用升壓預處理器)
  • 處理通過整數對象(而不是原始指針)句柄(點菜MPI)提供手柄驗證以及64位Fortran的特殊價值和一些便攜性。

感謝

回答

4

在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

很好,它需要創建/破壞/接入C++的對象。 所以它不是那麼簡單。 – Anycorn 2010-04-25 18:20:37

+0

@aaa:更新,重新加載頁面 – Potatoswatter 2010-04-25 18:22:43

+0

我將不得不考慮它。這樣做之前有一些問題,但現在我不記得它是什麼了。謝謝你的回答 – Anycorn 2010-04-25 18:28:35

0

一旦你有一個看起來像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 
+0

代碼庫不幸在fortran 77(對於我非常老的fortran iv來說令我驚訝) – Anycorn 2010-04-25 19:52:29

+0

你必須是彭博社員工 – 2010-04-25 23:15:44