溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

移植c到d07的方法有哪些

發(fā)布時間:2021-10-13 11:38:39 來源:億速云 閱讀:113 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“移植c到d07的方法有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“移植c到d07的方法有哪些”吧!

操作系統(tǒng)用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**轉(zhuǎn)為(空**)

第2種,消除了別名.dmd以前未提供棧跟蹤.但dmd在編譯2進制時,不論是共享庫/exe,配置文件都預(yù)先配置為導(dǎo)出所有符號.否則,無法實現(xiàn)跟蹤棧.但卻使我的函數(shù)指針與導(dǎo)出庫的函數(shù)指針沖突了.即使是手動加載的共享庫.因而只好用回別名方式.不會導(dǎo)出別名函數(shù)指針/變量.如果你制作動態(tài)綁定,一定要注意這點.我仍然用空**來加載函數(shù)指針,因為它更簡單.

foo = cast(da_Foo)getSymbol("foo");
//你看不到
//你看到了
foo = bindFunc(cast(void**)&foo, "foo");

手動搞,后者復(fù)制粘貼更快.還有一點.給定一個動態(tài)綁定函數(shù)指針,要遵守d的存儲變量規(guī)則.d變量,默認(rèn)為線程本地的,即每個線程有份變量拷貝.

如果在一個線程加載,而在另一個線程中調(diào)用,會崩潰的.

幸好,d的函數(shù)指針默認(rèn)初化為null,解決方式是跨線程共享,用shared/__gshared.d的一個目標(biāo)就是使并行更容易.通過共享,可以跨線程共用.編譯器會說,這不是線程安全訪問方式,與不變,常一樣,共享也是傳遞性的,你引用一個共享變量,這個引用也是共享的了.用__gshared時,就是全局變量,由程序員負(fù)責(zé)同步.因此,實現(xiàn)動態(tài)綁定時,要決定用線本?共享?全局共享?.

一般用__gshared,因為線程都要訪問.這時,要確保其自身生命期比訪問者更長,因而一般在靜態(tài)模塊構(gòu)造器和析構(gòu)器中加載/卸載他們.

extern( C )
{
alias void function(int) da_foo;
alias int function() da_bar;
}

__gshared
{
da_foo foo;
da_bar bar;
}

如何加載庫.我在DerelictUtil中實現(xiàn)了抽象了加載庫并取符號.外部我用自由函數(shù)來加載.

綁定要付出努力,動態(tài)綁定更累,其他人喜歡靜態(tài)綁定,但解析c是個難題.我更喜歡動態(tài)綁定.

到此,相信大家對“移植c到d07的方法有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI