如何在D中傳遞一個委託給外部函數指針的C函數?將代表傳遞給D中的外部C函數
回答
讓我交交我在新聞組說:
我如何通過委託來取 函數指針外部C函數?
不能在一般的直接做到這一點,除非你能修改C 功能,那麼你就可以破解它周圍,但委託和 普通函數指針是相當不同的動物。
但也許你可以魔法破解它。注意:
// a C function that needs a plain function
extern(C) void test(void function() f) {
// pretend this is implemented in C
f();
}
// just create a random delegate
void delegate() foo(int a) {
return { import std.stdio; writeln(a); };
}
// what we want to work
void main() {
auto dg = foo(10);
dg(); // works
//test(dg); // won't work
test(bindDelegate(dg)); // we want this
}
// transform delegate into pointer..
import std.traits;
auto bindDelegate(T, string file = __FILE__, size_t line = __LINE__)(T t) if(isDelegate!T) {
static T dg;
dg = t;
extern(C)
static ReturnType!T func(ParameterTypeTuple!T args) {
return dg(args);
}
return &func;
}
什麼bindDelegate所做的是創建一個特殊的靜態變量併爲特定呼叫 功能。就好像我們寫了一個單獨的 函數,並且全局地持有它。
的__FILE__
,__LINE__
東西是骯髒的黑客攻擊,使其 實例化一個單獨的變量+函數對針對不同 線以全局變量保持委託不會那麼容易 覆蓋。
聰明的把戲! :) – DejanLekic
我也剛剛意識到,由於全局持有委託,它將始終分配一個動態閉包,它所指向的內存永遠不會被釋放;該參考文件將繼續存在。 (好吧,你也許可以用同樣的文件和行參數來執行另一個bindDelegate調用,而null可以這樣清除它,但實際上誰會打擾?)這可能是好的和壞的:好的是C可以自信地使用它GC不會過早地清理它。當然,糟糕的是,一旦你完成了它,內存泄漏的可能性就會降低。所以請注意這個警告。 –
如何而不是採取一個文件和行,你拿一個指針的類,並作爲字符串的方法名?這樣它只能被對象或同一位置上的另一個對象覆蓋。 (意味着原始物體無論如何都被毀壞了) –
- 1. 將C#代碼中的數組(或TList)傳遞給外部javascript?
- 2. 將ifstream傳遞給C++中的函數
- 3. 將C#中的命令行參數傳遞給外部exe
- 4. 將C++ lambda傳遞給C函數
- 5. 將fortran 77函數傳遞給C/C++
- 6. 將具有單列和行的外部表中的值傳遞給函數
- 7. 將變量傳遞給c#代碼中的javascript函數
- 8. 將代碼從c#傳遞給c作爲函數參數
- 9. C++將2d數組傳遞給函數
- 10. 將[out]數組傳遞給C++函數
- 11. 將數組傳遞給函數C
- 12. C++將char數組傳遞給函數
- 13. 將數組傳遞給函數c
- 14. 將數組傳遞給函數c
- 15. LLVM將0作爲參數傳遞給外部函數調用
- 16. 如何通過map.event.addListener將參數傳遞給外部函數
- 17. 將「太多」參數傳遞給外部函數是否安全?
- 18. 將模板類參數傳遞給外部函數
- 19. XS:將外部庫的函數傳遞給Perl XS回調
- 20. 如何將main的argv []值傳遞給外部函數
- 21. 將參數從函數傳遞給Java中的內部函數?
- 22. 將部分列名傳遞給函數
- 23. 將代表傳遞給事件c#
- 24. PostgreSQL中的聚合函數將數組傳遞給C函數
- 25. 將查詢表傳遞給mvc中的另一個函數c#
- 26. GTK + 3.0 C++將GtkTextBuffer傳遞給函數
- 27. 將比較函數傳遞給qsort C++
- 28. 將Lua函數傳遞給C++
- 29. 將值傳遞給C++函數
- 30. 將Python函數傳遞給Boost C++
爲什麼這是downvoted? –
可能因爲你有一個「C」標籤。這裏的C程序員在觸發器上很快......至少那是我的經驗。 – DejanLekic
@OMGtechy我已經嘗試了一些東西,比如簡單地傳遞委託,並試圖使用.funcptr屬性,但它們都沒有工作。我很確定我見過人們這樣做,但我在Google上找不到任何示例。 –