這篇文章主要介紹“如何將c移植到d06中”,在日常操作中,相信很多人在如何將c移植到d06中問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何將c移植到d06中”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
方法.但問題是...里面放什么,取決于c編譯器,從最不重要位還是最重要位開始.及字段間是否有空白間隙.與std.bitmanip.bitfields遇著的問題一樣.
我遇見過,然后用單個不能訪問它的標志位字段,如果在多平臺同其他編譯器的庫一起運行,沒有簡單解決方法.只有交給用戶了.特定綁定,針對特定編譯器/特定平臺.
函數指針.一般作為回調.d有自己的語法,所以必須適配.
int function() MyFuncPtr;
//d風格指針聲明
格式為中類型->函數關鍵字->參數列表->函數指針名
直接用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));
}
//這樣轉換
// 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較好,可以復用.接下來,構中內聯聲明函數指針.
// In C, foo.h
typedef struct
{
int (*BarPtr)(int);
} baz_t;
// In D
struct baz_t
{
extern( C ) int function(int) BarPtr;
}
靜態綁定中的函數聲明.d中不必聲明.實現即是聲明.也與你實現/聲明位置無關.為鏈接c庫,不必也無權訪問實現,因而綁定.為了調用他們,d要知道存在他們.以便鏈接時找到正確地址.因此,必須聲明.
// In C, foo.h
extern int foo(float f);
extern void bar(void);
// In D
extern( C )
{
int foo(float);
void bar();
}
動態綁定.用函數指針而不是函數聲明.簡單聲明是不行的.先要考慮初化函數指針.
// D中.
int foo() { return 1; }
void* getPtr() { return cast(void*) &foo; }
void main()
{
int function() fooPtr;
fooPtr = getPtr();
}
//編譯得到
fptr.d(10): Error: 不能隱式把(getPtr())的(void*)類型轉為`int function()`
到此,關于“如何將c移植到d06中”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。