本篇内容主要讲解“移植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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。