d唐的导入C的经验

原文
我为自己构建并从C移植D的金融工具包中的主应用,使用了gtk3sqlite3C库.来谈谈gtk,它是个有许多令人费解复杂头文件大系统.我在D代码中处理了gtk.

alias gconstpointer = immutable(void) *;

struct GtkWindow; 
//这样定义,所有仅由指针处理的构

struct GtkTreeIter {
    long[4] dontcare;
}
//类似的构需要在`D代码`中栈分配
//地址传递给gtk函数,根据`C`文件中包含大小的全局变量来检查大小.

extern (C) void gtk_tree_selection_select_iter(GtkTreeSelection* selection, GtkTreeIter* iter);

这是ImportC之前的标准方法.虽然混乱而丑陋,但它是有效的.然而,如果库函数和C头文件变化,应用不可预测难以调试.目前,我使用的是gtk3,暂时不会改变,但他们已转移到了使用了稍微不同的APIgtk4.如果我决定更新gtk4,使用该方法,我面临破坏风险.
评论
我阅读了几次ImportC文档.然后看到了Walter的评论.在D代码中,可只导入头文件!相关节是41.3.2,给定import hello,它说"如果hello不是D文件,且扩展名为.i.c,用ImportC编译hello".没有提到.h文件.

清楚地说明了两件事:我的情况如何就使用ImportC,文档需要提供导入C头文件示例来更正和改进.导入头文件以便可直接使用C库ImportC成为D的重要补充的主要原因,文档应非常清楚说明如何导入.
我决定试用ImportC.我的所有D源文件都已有了"import gtk"语句,来得到上面我手写的定义.因此不需要更改,因为现在目标导入 gtk.h.
简单更改此makefile为:dmd编译D源文件时,标准的pkg-conf主要扩展为用"-I"指示在哪里可找到所有的gtk头文件.因为dmd需要的-I格式与clang格式略有不同.还需要删除dmd不支持的几个开关.
还删除了检查构大小(及其在C文件中的定义)的,因为现在可直接从Gtk头文件中得到构定义.

然后,我删除了makefile中对gtk.d源文件的所有引用.由于我忽略了一些东西,在几次错误启动之后,成功构建应用.一切只用了不到一个小时.我做了一些粗略的测试,似乎工作正常.我对这是多么容易感到惊讶.
因此,根据我最初的经验,Walter关于ImportC有用性的语句是对的,在我看来,ImportC极大地增强了D的竞争地位.营销!
还要补充一点,几年前开始,我玩过zig,被它的translate-c功能所吸引,它类似ImportC.我最终还是回到了D.因为Zig过去和现在都没有准备好,也因为前面说过的我和Rust的不幸遭遇.

posted @   zjh6  阅读(17)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示