是否有庫/頭已經寫入來使用不透明指針/句柄從C管理C++對象?C/C++不透明指針庫
我可以自己寫一個,但我寧願使用已經提出的解決方案,特別是如果它具有fortran綁定。
我的具體要求是:
- 包裝發電設施(我的想法是使用升壓預處理器)
- 處理通過整數對象(而不是原始指針)句柄(點菜MPI)提供手柄驗證以及64位Fortran的特殊價值和一些便攜性。
感謝
是否有庫/頭已經寫入來使用不透明指針/句柄從C管理C++對象?C/C++不透明指針庫
我可以自己寫一個,但我寧願使用已經提出的解決方案,特別是如果它具有fortran綁定。
我的具體要求是:
感謝
在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"
。看他們的手冊。
您可能能夠找到一個代碼生成器來爲您執行此操作。如果可以,手動操作當然更安全。
一旦你有一個看起來像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
代碼庫不幸在fortran 77(對於我非常老的fortran iv來說令我驚訝) – Anycorn 2010-04-25 19:52:29
你必須是彭博社員工 – 2010-04-25 23:15:44
很好,它需要創建/破壞/接入C++的對象。 所以它不是那麼簡單。 – Anycorn 2010-04-25 18:20:37
@aaa:更新,重新加載頁面 – Potatoswatter 2010-04-25 18:22:43
我將不得不考慮它。這樣做之前有一些問題,但現在我不記得它是什麼了。謝謝你的回答 – Anycorn 2010-04-25 18:28:35