​原文​​​ 我为​​自己​​构建并从C​​移植​​到​​D​​的金融工具包中的主应用,使用了​​gtk3​​和​​sqlite3C​​库.来谈谈​​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​​​,暂时不会改变,但他们已转移到了​​使用​​​了稍微不同的​​API​​​的​​gtk4​​​.如果我决定​​更新​​​到​​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​​的不幸遭遇.