最新要闻
- 今日热门!Stable Diffusion模型发布新版本:生成图像以假乱真
- 钻石价格,突发“跳水”!未来还会更便宜?
- 泰坦号事故后:加拿大将展开事故调查
- 车主自曝差点被闷死在特斯拉Model X里 车门锁死 原因揭晓
- 蔡徐坤巡演新加坡站开票 《Hug me(remix版)》同日上线
- 每日简讯:4亿票房端午黑马:《消失的她》官宣海外定档
- 冲入球场拥抱梅西小伙获释后道歉:我真不是没素质的人
- 世界观天下!新会绿美生态园票价(新会绿美生态园票价多少钱)
- 腾讯两大国民APP账号又打通了?QQ悄然支持微信登陆 环球精选
- 环球快报:调查称安卓更易上手:iPhone用户遇到问题概率高出58%
- 环球热资讯!Zen3清库存?突然冒出个很特别的锐龙5 5700
- 虚幻5打造!腾讯动漫《斗罗大陆2》今日两集首播 霍雨浩初入星斗大森林|每日观察
- “空中出租车”亮相巴黎航展:可降落空间直径仅需15米-环球速递
- 古力娜扎曾遭换脸视频威胁勒索:不给钱就毁了你!
- 男生单曲循环《好运来》查出593分大哭:比平时多出50分 超常发挥
- 全球钻石价格较峰值暴跌18%:人造钻石市场规模不断扩大_全球视点
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
DLang 与 C 语言交互
DLang 与 C 语言交互
很难受的是,这部分的文档太少了,根本没有 教程向的文章。所以我写了此文以做分享。
本文原址链接(防止机器搬运):https://www.cnblogs.com/jeefy/p/17499441.html
阅读提示:请保证如下条件:
(相关资料图)
会基本C语言使用,以及其编译命令。
会基本D语言使用,以及其编译命令。
会使用
Makefile
之类的东西(不会也无所谓),不会dub
- DLang 与 C 语言交互
- 最简单的例子
- 链接库
- 函数,参数?
最简单的例子
// chello.c#include void hello(void) { puts("Hello World!");}
// hello.dextern (C) void hello();void main() { hello();}
其实上面的两个程序的意义非常明显,就是最基本的
Hello World!
输出罢了。
我们有了上面两个文件后可以通过如下命令编译:
gcc -c chello.cdmd hello.d chello.o
最终会得到一个 main
可执行文件(也可能是 main.exe
,看系统)。运行它,你就得到了 Hello World!
接下来对于部分做出解释。
函数的声明:在
hello.d
中有一句extern (C) void hello();
,这就是函数的声明部分,由于 dlang 与 C++ 一样在处理函数名的时候会做一些变化,然而 C 中的函数名却是不变的,所以需要显式声明其函数名的处理方式:extern (C)
,也就是按照 C 的处理方式处理,这样才能调用到chello.o
中的hello
方法。编译的命令:唯一需要注意的是需要把
.o
文件显示的放入编译命令中。头文件:这是困扰我最久的一个点,dlang 如何使用 C 的头文件?后来才发现了一个误区,dlang 不存在头文件的说法,也就是说 dlang 无法 直接使用
.h
文件。但是我们又需要声明函数怎么办?在官方文档中有这样一个命令:gcc -E -P program.h > program.lst
这个命令的作用在于列出所有声明的东西(包括函数与结构体的声明)。在经过一定的修改后,就可以变为
.d
文件(做类似于头文件的作用)。
接下来我们尝试一点更加高级的东西。
链接库
我使用的例子是我自己在写的一个小东西。参见:
假如我需要使用一个简单的 SDL
程序以显示一个色块。我可以很轻易的写出如下代码:
// cshow.c#include #include // 省略了部分宏定义....避免冗长int showColor(int R, int G, int B) { SDL_PREWORK(50, 50); while (!done) { SDL_MYEQUIT(60); if (SDL_SetRenderDrawColor(ren, R, G, B, 255) < 0) { fprintf(stderr, "Error Set render draw color: %s\n", SDL_GetError()); return -1; } SDL_RenderFillRect(ren, NULL); SDL_RenderPresent(ren); } SDL_CLEANUP; return 0;}
对于 dlang 中的调用也很明了:
// color.d// show the color by SDL (written in C)extern (C) int showColor(int, int, int);
只是问题出在编译的部分。
如果我们按照一下步骤编译:
gcc -c cshow.c `pkg-config sdl2 --cflags --libs`dmd color.d cshow.o
我们最终会发现出现 undefined reference to ...
的错误。
在官方文档中并没有提及使用系统链接库的问题。但是 隐晦的给出了解决方法。
我们直接找到 libSDL2.so
所在的位置。在我的系统中是 /usr/lib/x86_64-linux-gnu/libSDL2.so
于是编译命令新增一个部分,变为:
gcc -c cshow.c `pkg-config sdl2 --cflags --libs`dmd color.d cshow.o /usr/lib/x86_64-linux-gnu/libSDL2.so
也就是直接把链接库也带上……属实给我整无语了。
啊,于是,我们不能真的吧所有库的位置全部找到,然后在编译的时候一个一个复制上去吧。所以就需要类似与 Make
或者 CMake, meson
之类的构建工具辅助我们。这部分不过多展开。
函数,参数?
有些时候,我们想要在 C 中使用 dlang 分配的内存。如:
// exmaple.cvoid fillMem(int *dst, int size, int val) { for (int i = 0; i < size; ++i) dst[i] = val;}
自然的,我们可以想到:
// example.d// 错误示例!!!!!!!!!!!!!!!!!!!!import std.stdio;extern (C) void fillMem(int[] dst, int size, int val);void main() { int[] arr = new int[](3); fillMem(arr, 3, 1); writeln(arr[2]);}
可以编译通过,然后运行……输出 0
。
讲道理应该是输出 1
才对。
那么很明显,类型出了问题,我们不应该如此操作。
于是参考官方文档。正确的姿势如下:
import std.stdio;extern (C) void fillMem(int* dst, int size, int val);void main() { int[] arr = new int[](3); fillMem(arr.ptr, 3, 1); writeln(arr[0]); writeln(arr[1]); writeln(arr[2]); writeln(arr.length);}
为什么如此?在 dlang 中,可变长数组其实有两个变量,可以理解为:
struct { int length; int * ptr;}
当然,类型肯定不是这样的……
也就是说 arr.ptr
中才存着数据。所以如此。
那么考虑不可变长数组。好像还是只能使用上面那种声明和调用方法……
这就是在传递参数的时候最需要注意的一个点。其他的参数类型转化可以参考:
https://dlang.org/spec/interfaceToC.html
https://wiki.dlang.org/D_binding_for_C
关键词:
DLang 与 C 语言交互
Apollo2.1.0+Springboot使用OpenApI
邮箱:微信企业域名邮箱给gmail或hotmail等域外邮箱发邮件被退回问题如何解决? 环球观焦点
今日热门!Stable Diffusion模型发布新版本:生成图像以假乱真
钻石价格,突发“跳水”!未来还会更便宜?
使用python发送sip协议的OPTIONS 热门
k8s 深入篇———— k8s 的pod[五]-全球播资讯
8. Java-AOP 面向切面编程
文心一言 VS 讯飞星火 VS chatgpt (46)-- 算法导论6.1 4题|全球热点评
泰坦号事故后:加拿大将展开事故调查
车主自曝差点被闷死在特斯拉Model X里 车门锁死 原因揭晓
蔡徐坤巡演新加坡站开票 《Hug me(remix版)》同日上线
来一打自建IP Proxy玩玩之Majora
kafka学习之五_多个磁盘的性能验证 世界快看点
Go——常用函数
每日速递:卷福的十年同学会
每日简讯:4亿票房端午黑马:《消失的她》官宣海外定档
冲入球场拥抱梅西小伙获释后道歉:我真不是没素质的人
世界观天下!新会绿美生态园票价(新会绿美生态园票价多少钱)
腾讯两大国民APP账号又打通了?QQ悄然支持微信登陆 环球精选
环球快报:调查称安卓更易上手:iPhone用户遇到问题概率高出58%
java 异常处理,事务管理,事务共用,事务传递 天天微头条
Go-闭包和defer|最新资讯
环球热资讯!Zen3清库存?突然冒出个很特别的锐龙5 5700
虚幻5打造!腾讯动漫《斗罗大陆2》今日两集首播 霍雨浩初入星斗大森林|每日观察
“空中出租车”亮相巴黎航展:可降落空间直径仅需15米-环球速递
古力娜扎曾遭换脸视频威胁勒索:不给钱就毁了你!
男生单曲循环《好运来》查出593分大哭:比平时多出50分 超常发挥
全球钻石价格较峰值暴跌18%:人造钻石市场规模不断扩大_全球视点
环球最新:甲亢遇到异食癖:法国男子一顿吃15人份 急了还吃石头木塞
全球热点评!公鸡突然从背后“偷袭”萌娃 飞起两脚踹倒在地 第二天端午节就被炖了
泰国和美国两地大量鱼类死亡 或与海洋升温有关 快看点
【技术积累】C语言中的指针【一】_世界百事通
Go-自定义数据类型(函数类型)详解
行业风险管理需求强烈
焦点信息:AMD RX 7800被逼急了!硬塞进去个“大胖子”
世界视点!一考生查分 全家一起喊出“666”:打算冲击复旦、交大
Kafka学习之四_Grafana监控相关的学习
一天吃透MySQL面试八股文 环球微速讯
什么是大模型? 每日热讯
内马尔在足球界的地位_内马尔的盘带水平在足球史上处于什么地位 全球要闻
【环球财经】伦敦金属交易所基本金属23日多数下跌_全球信息
白玉兰奖完整名单出炉 年初大热电视剧《狂飙》挂零陪跑-天天实时
中国高空开伞试验运载器发射连续成功:木星、天王星我们来了! 今日热讯
男子微信回了个“OK”表情 结果竟成被告!一点都不冤 速读
环球报道:尼康Z8新故障导致无法锁定镜头:官方承诺免费维修
【天天新要闻】读发布!设计与部署稳定的分布式系统(第2版)笔记10_自动化和缓慢的响应
无线路由器怎么连接电视(无线路由器怎么连接)
【环球新要闻】要考北大!汶川“敬礼娃娃”郎铮高考637分:15年前被埋20小时
关注:OPPO突然放弃自研芯片 真是因为没钱了?3000哲库人不信
看热讯:四川学霸女生高考712分查完分就睡觉、汶川“敬礼娃娃”郎铮637分
微软承认输掉“主机战争”:Xbox难以与竞争对手抗衡 每日头条
环球微动态丨特斯拉AI账号悄然上线:Dojo超级计算机下月开始生产
pro e
无牌产品硬刚国际大牌 就因为带货主播们买地建厂?
复兴号开进青藏铁路 提速至160公里/时 全程不到6小时
微软终于认怂!重新恢复Win11文件管理器经典功能
《人世间》赢麻!成最佳中国电视剧 雷佳音吴越分获白玉兰最佳男女主角_当前热门
“泰坦”号悲剧隐患早已埋下
2023年 年轻人被迫流行功能机了?-每日快看
全球快资讯丨【技术积累】Git中的基础知识【一】
世界信息:登录验证,JWT,过滤器,拦截器使用总结 2023
全球资讯:索尼时隔10年公布全新PS掌机Q!价格够低
焦点资讯:女孩没考好 和妈妈吵架后竟被丢高速:网友观点出奇一致
“4S店之王”破产离场 斯巴鲁中国重大变更:开始独资|当前焦点
大超险些成为007 环球快资讯
南漳县属于哪个省市_南漳县属于哪个市|每日速讯
今日快看!电影相约2000年(相约2000年)
imessage怎么设置不要钱_imessage怎么设置
Springboot web 项目开发流程梳理总结|世界讯息
今日热门!模型剪枝:让深度学习模型更好地应对不同的任务和环境
WEB安全-渗透测试-waf绕过信息收集_世界快看点
【独家焦点】“超人”亨利卡维尔有望成为007新片邦德扮演者:试镜效果棒极了
长安欧尚Z6新能源半年降价3万多 车主集体投诉
天天讯息:ASP.NET Core MVC 从入门到精通之缓存
全球时讯:文心一言 VS 讯飞星火 VS chatgpt (45)-- 算法导论6.1 3题
当前头条:【后端面经-Spring】Spring 中 bean 的生命周期)
美国国债收益率持续下跌,10年期国债收益率下跌8.90个基点 世界资讯
世界通讯!GPS靠边!北斗全球卫星导航系统星座部署完成3年 正突破毫米级甚至更小精度
【忠阳车评】固态电池量产难在哪 世界微资讯
【天天报资讯】微软爆料索尼PS6主机:2028年推出
光刻机一哥荷兰ASML:建立全自主半导体产业链几乎不可能!|环球热讯
K8S安装记录
《暗黑破坏神4》野蛮人双晕结算流分享 野蛮人双晕结算流怎么玩?
高考查分场面代入感太强 男生601分激动得满屋蹦跳:高中三年考最好的一次
重庆两案例入选全国职业教育产教融合典型案例_观天下
5人全部遇难 泰坦号残骸距离泰坦尼克号500米 快看点
【世界快播报】轴距超过Model Y 3.5秒破百 即将上市的起亚EV6到底行不行?
一年4.3万人死于车祸!美国要求所有大货车大客车配备自动刹车系统_世界速递
dll格式用什么软件打开(如何打开dll格式文件) 全球热头条
环球快看点丨全国龙舟身价“天花板”?广东一条龙舟70个房东 身价20亿 这事是真的
今日视点:女子番茄吃多胃痛医生让喝可乐:照做两天后缓解!专业人士科普
泰坦号观光艇内爆5名乘员死亡 一款游戏销量暴涨 玩家:6美元体验惨案
每日看点!BLOG-3----22206117
环球热点评!留给“牛粉”的时间不多了!兰博基尼宣布:Urus将于五年内变为纯电车型
25万美元一趟值吗?致5死泰坦号潜艇内部曝光:没凳子只能盘腿坐 马桶是最佳座位
云南上线购车送油券活动:每车2500元 可在中石油、中石化消费
缅北电诈愈演愈烈,人口贩卖已成全球性危机 焦点快播
强化学习从基础到进阶-案例与实践[3]:表格型方法:Sarsa、Qlearning;蒙特卡洛策略、时序差分等以及Qlearning项目实战
ChatGPT和AI会重燃中国的虚拟宇宙吗?-世界聚焦