温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

移植c到d07的方法有哪些

发布时间:2021-10-13 11:38:39 来源:亿速云 阅读:99 作者:iii 栏目:编程语言

本篇内容主要讲解“移植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的方法有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI