很多语言都可以实现与C语言的互相调用,但我觉得D语言做的更好些,D与C的兼容是二进制兼容,不是在源码上的兼容,也就是说编译手的二进制文件是可以互相链接的。废话不多说,直接上例子

一、在D语言中调用C函数

首先是准备一个C函数

// foo.c#include <stdio.h>
int test()
{printf("message from c\n");return 123; // 随便返回一个值
}

$ gcc -c foo.c

生成 foo.o

D代码

// bar.d
import std.stdio;extern(C) int test();void main()
{int rv = test();writeln("test return is:", rv);
}

$ dmd bar.d foo.o

./bar

message from c

test return is:123

可以看到,要调用C的函数只需要使用 extern(C) 声明函数,然后一起编译即可,如果是调用C生成的so,只需要在编译D程序的时候加上链接函数即可如 dmd bar.d -L-lxx

是不是很简单呢,跟C++调用C看上去一样,只是编译的时候D需要的是二进制文件,C++需要的是源代码

网上有很多资料都说D对C的支持是不完全的,这么说虽然也没问题,但是明显好像是说支持的不好,其实支持的非常好,只是不同的编译器对C都会有些各自的扩展,这方面支持的不算好

从D调用C没什么,但是能从C调用D函数要怎么做呢,这方面能作到和C++一样方便的就只有D了,在D语言中分两种情况,一种是简单的函数,另一种是D函数中用到了D中的高级特性,如类,关联数组,委托等,简单函数只要声明为extern(C) 就可以了,如果使用了高级特性也不难,只不过没有这方面的资料来说明,需要调用D运行库中的额外两个函数,rt_init() 和 rt_term ,相信看到名子就能理解他的意思了,要想支持D中的高级特性只需要初始化D运行时库,在结束的时候释放D运行库的资源即可,看下面的例子

D代码

import std.stdio;class Test // 使用类
{int a = 100;void printA(){   writeln(this.a); // 使用D标准IO函数}   auto getAA(){   return ["k1":111, "k2": 222, "k3": 334]; // 返回一个关联数组}
}extern(C) void test() // 需要声明为extern(C)
{auto t = new Test;t.printA();writeln(t.getAA());
}

C代码

// bar.c
int rt_init();
int rt_term();
int test();int main()
{rt_init();test();// ...rt_term();
}

编译

$ dmd -c foo.d

$ gcc -o main bar.c foo.o -lphobos2 -L /usr/share/dmd/lib/

./main

100

["k1":111, "k2":222, "k3":334]

我们看到,上面说到的额外两个函数的用法

需要注意的是编译的时候需要链接 libphobos2这个库,这个是D的标准库,我的是在Mac下的默认安装目录,根据情况找到安装目录即可

与C语言互调除了C++外,只有D做的最简单了,只比C++多了两个额外的函数调用,除了extern(C) 声明外,其它代码就正常写就行了,不需额外的对C的兼容做努力,在C代码中需要多调用两个函数,如果想要C不知道这两个函数的存在,可以把这两个函数的调用放在D代码里调用就行了,即初始化和释放动作自己负责,不给调用者带来麻烦

如果您对这方面的内容还有什么疑惑,欢迎交流

转载于:https://blog.51cto.com/quetzal/1632959

D语言与C语言的互相调用相关推荐

  1. Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本

    Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本 首先参考http://wiki.chumby.com/index.php?title=Lua&print ...

  2. c语言中go的作用,go语言与c语言的相互调用

    由于工作原因,需要实现go语言与c语言的相互调用.由于go语言与c语言有着千丝万缕的暧昧关系,两者之间的调用可以通过语言层面实现.下文是对此的总结. ​ go语言调用c语言 以下为一个简短的例子: p ...

  3. python语言+selenium自动化,编写脚本调用Chrome、Firefox浏览器打开百度网站

    python语言+selenium自动化,编写脚本调用Chrome.Firefox浏览器打开百度网站 目标:初始化一个webdriver实例对象driver,通过webdriver.Chrome()和 ...

  4. python调用r语言加载包错误_Python调用R语言

    网络上经常看到有人问数据分析是学习Python好还是R语言好,还有一些争论Python好还是R好的文章.每次看到这样的文章我都会想到李舰和肖凯的<数据科学中的R语言>,书中一直强调,工具不 ...

  5. c语言调易语言dll,易语言DLL来返回文本供其他语言调用

    部分简介 在使用易语言与其他语言配合编程中,有时需要使用易语言的DLL来返回文本型的值,但是由于易语言本身文本型数据不能直接返回让其他语言使用(直接使用多次会崩溃).所以这里要使用一种转换的方式,是其 ...

  6. C语言_公倍数、最小公倍数_调用函数求最大公因数最小公倍数

    公倍数:两个或两个以自然数共同的倍数. 最小公倍数:两数(多个数)相乘除以两数(多个数)的最大公约数. //最小公倍数 #include<stdio.h> int main() {int ...

  7. C语言_函数结构体的调用

    C语言_函数结构体的调用 #include<stdio.h> //定义存储函数的结构体 struct map{//定义无参数类型返回void的函数指针void (*p)(); }; /** ...

  8. smali语言详解之方法的调用

    smali语言详解之方法的调用 一.方法调用关键字介绍 smali语言方法调用关键字主要有以下五种 invoke-virtual主要用于非私有实例方法的调用.实例方法指不是构造方法.父类方法等的属于这 ...

  9. python语言介绍-Python语言的简介

    ___________________________________________________________我是一条分割线__________________________________ ...

  10. python语言介绍-Python语言简介

    一.Python语言发展史 1989年吉多·范罗苏姆(Guido van Rossum)中文外号"龟叔",圣诞节期间开始编写Python语言的编译器. Python这个名字,来自G ...

最新文章

  1. 冒泡排序(O(n^2))
  2. SAP Business ByDesign云计算ERP软件
  3. linux基础,文件目录管理,cd、rm、mkdir
  4. c2c旅游springboot开源_重量级开源的商城和SpringBoot等项目看看有没有正好是你需要的...
  5. Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  6. mysql 字符串取前缀_mysql截取字符串的函数总结
  7. html让空间高度跟随父级,CSS子元素跟父元素的高度一致的实现方法
  8. add jar and proxy repo
  9. Python——format()/str.format()函数
  10. C++设计模式::装饰模式or代理模式or面向切片编程(AOP)
  11. 【Typecho插件-前端-播放器】BiliVid -- 好用的Bilibili视频链接解析播放器
  12. java实现文章伪原创_网站伪原创的方法 - 百度搜狗360神马网站快速排名 - OSCHINA - 中文开源技术交流社区...
  13. 去哪儿网前端架构师司徒正美:如何挑选适合的前端框架?
  14. 从代码和底层探究Synchronized锁实现
  15. 李华明Himi 游戏开发
  16. 学习Hibernate框架笔记-第2天
  17. 苹果操作系统 leopard 10.5 (PC破解完全中文安装版,IBM X40安装成功)
  18. C++不知算法系列之高精度数值处理算法
  19. Mysql数据库最佳性能优化
  20. 量化:纸上得来终觉浅,绝知此事要躬行。

热门文章

  1. [转]SQL注入攻防入门详解
  2. 树型目录菜单,菜单图标不是图片,是字体
  3. iOS - Flutter混合开发
  4. react native 导入组件
  5. linux消息队列非亲缘,linux进程
  6. AndoridSQLite数据库开发基础教程(5)
  7. Joomla!网站扫描工具joomscan
  8. OUYA游戏开发核心技术剖析OUYA游戏入门示例——StarterKit
  9. mysql城市联动表怎么建_MVC4.0搭建的省市县三联动,包含数据库
  10. python三国演义人物出场统计_python爬取三国演义文本