溫馨提示×

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

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

如何將c移植到d06中

發(fā)布時(shí)間:2021-10-13 15:33:21 來源:億速云 閱讀:137 作者:iii 欄目:編程語言

這篇文章主要介紹“如何將c移植到d06中”,在日常操作中,相信很多人在如何將c移植到d06中問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何將c移植到d06中”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

方法.但問題是...里面放什么,取決于c編譯器,從最不重要位還是最重要位開始.及字段間是否有空白間隙.與std.bitmanip.bitfields遇著的問題一樣.

我遇見過,然后用單個(gè)不能訪問它的標(biāo)志位字段,如果在多平臺(tái)同其他編譯器的庫一起運(yùn)行,沒有簡(jiǎn)單解決方法.只有交給用戶了.特定綁定,針對(duì)特定編譯器/特定平臺(tái).

函數(shù)指針.一般作為回調(diào).d有自己的語法,所以必須適配.

int function() MyFuncPtr;
//d風(fēng)格指針聲明

格式為中類型->函數(shù)關(guān)鍵字->參數(shù)列表->函數(shù)指針名

直接用MyFuncPtr也可以,但也可定義別名.

alias int function() da_MyFuncPtr;
da_MyFuncPtr MyFuncPtr;
//沒啥意思
int foo(int i)
{
return i;
}

void main()
{
int function(int) fooPtr;//
fooPtr = &foo;
alias int function(int) da_fooPtr;
da_fooPtr fooPtr2 = &foo;
import std.stdio;
writeln(fooPtr(1));
writeln(fooPtr2(2));
}
//這樣轉(zhuǎn)換
// In C, foo.h
typedef int (*MyCallback)(void);
// In D
extern( C ) alias int function() MyCallback;

用別名,這樣,你可像c一樣用.

// In C, foo.h
extern void foo(int (*BarPtr)(int));

// In D.
// 1這樣
extern( C ) void foo(int function(int) BarPtr);

// 2這樣
extern( C ) alias int function(int) BarPtr;
extern( C ) void foo(BarPtr);

2較好,可以復(fù)用.接下來,構(gòu)中內(nèi)聯(lián)聲明函數(shù)指針.

// In C, foo.h
typedef struct
{
int (*BarPtr)(int);
} baz_t;

// In D
struct baz_t
{
extern( C ) int function(int) BarPtr;  
}

靜態(tài)綁定中的函數(shù)聲明.d中不必聲明.實(shí)現(xiàn)即是聲明.也與你實(shí)現(xiàn)/聲明位置無關(guān).為鏈接c庫,不必也無權(quán)訪問實(shí)現(xiàn),因而綁定.為了調(diào)用他們,d要知道存在他們.以便鏈接時(shí)找到正確地址.因此,必須聲明.

// In C, foo.h
extern int foo(float f);
extern void bar(void);
// In D
extern( C )
{
   int foo(float);
   void bar();
}

動(dòng)態(tài)綁定.用函數(shù)指針而不是函數(shù)聲明.簡(jiǎn)單聲明是不行的.先要考慮初化函數(shù)指針.

// D中.
int foo() { return 1; }
void* getPtr() { return cast(void*) &foo; }
void main()
{
   int function() fooPtr;
   fooPtr = getPtr();
}
//編譯得到
fptr.d(10): Error: 不能隱式把(getPtr())的(void*)類型轉(zhuǎn)為`int function()`

到此,關(guān)于“如何將c移植到d06中”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

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

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

AI