您好,登錄后才能下訂單哦!
本篇內容主要講解“移植c到d07的方法有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“移植c到d07的方法有哪些”吧!
操作系統用GetProcAddress/dlsym返回空*指針,一種是.
fooPtr = cast(fooPtr)getPtr();//變量,用作類型.
然后這樣:
alias int function() da_fooPtr;
da_fooPtr fooPtr = cast(da_fooPtr)getPtr();
所以,用別名要好點.da_表示d別名.還可以:
int foo()
{
return 1;
}
void* getPtr()
{
return cast(void*) &foo;
}
void bindFunc(void** func)
{
*func = getPtr();
}
void main()
{
int function() fooPtr;
bindFunc(cast(void**)&fooPtr);
}//將foo**轉為(空**)
第2種,消除了別名.dmd以前未提供棧跟蹤.但dmd在編譯2進制時,不論是共享庫/exe,配置文件都預先配置為導出所有符號.否則,無法實現跟蹤棧.但卻使我的函數指針與導出庫的函數指針沖突了.即使是手動加載的共享庫.因而只好用回別名方式.不會導出別名函數指針/變量.如果你制作動態綁定,一定要注意這點.我仍然用空**來加載函數指針,因為它更簡單.
foo = cast(da_Foo)getSymbol("foo");
//你看不到
//你看到了
foo = bindFunc(cast(void**)&foo, "foo");
手動搞,后者復制粘貼更快.還有一點.給定一個動態綁定函數指針,要遵守d的存儲變量規則.d變量,默認為線程本地的,即每個線程有份變量拷貝.
如果在一個線程加載,而在另一個線程中調用,會崩潰的.
幸好,d的函數指針默認初化為null,解決方式是跨線程共享,用shared/__gshared.d的一個目標就是使并行更容易.通過共享,可以跨線程共用.編譯器會說,這不是線程安全訪問方式,與不變,常一樣,共享也是傳遞性的,你引用一個共享變量,這個引用也是共享的了.用__gshared時,就是全局變量,由程序員負責同步.因此,實現動態綁定時,要決定用線本?共享?全局共享?.
一般用__gshared,因為線程都要訪問.這時,要確保其自身生命期比訪問者更長,因而一般在靜態模塊構造器和析構器中加載/卸載他們.
extern( C )
{
alias void function(int) da_foo;
alias int function() da_bar;
}
__gshared
{
da_foo foo;
da_bar bar;
}
如何加載庫.我在DerelictUtil中實現了抽象了加載庫并取符號.外部我用自由函數來加載.
綁定要付出努力,動態綁定更累,其他人喜歡靜態綁定,但解析c是個難題.我更喜歡動態綁定.
到此,相信大家對“移植c到d07的方法有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。