d不同c文件中导入c
原文
理想方法
是让每个头文件
都有自己的模块
.
这几乎需要DMD
合并C预处理器
,对吧?因为这是可靠
确定包含
哪些标头
的唯一方法
.
最好方法是实现C23
的带相同标签的相同类型是一样的,标签
兼容规则的一些变体
.导入
到全局C命名空间
表明,不能使用类型
定义冲突的两个C标头
.理想,使用D中的C
应该比使用C
中的C更好,并且允许在C模块
之间混合
兼容类型同时,通过模块
系统解决.
ImportC
对D来说是个很好的功能
.
这就是我在聊天线程
中说"用别名
"的原因.importc
模块本质上是选择性
地仅从神奇模块中导入
实际声明内容,并提供相同行为,但由于在别处规范名+定义
及合并
,别名
不会导致类型冲突
.
实现
可能较难,因为你通过导入过程
修改了伪模块
.很容易出现前向引用
错误.可手动测试该概念
.以博客
中相同示例为例,该示例在dmd主线
上使用importC
失败:
module __magic_importC;
// 表示所有导入的C定义
struct FILE;
extern(C) int printf(const char*, ...);
extern(C) int fclose(FILE*);
extern(C) void saySomethingToAFile(FILE*);
extern(C) FILE* openAFile();
//...
module b;
// 公共选择性导入
public import magic : FILE, printf, fclose, openAFile;
//...
module b2;
// 再次公共选择性导入
public import magic : FILE, printf, fclose, saySomethingToAFile;
现在成功
编译测试程序
.
import b;
import b2;
void main() {
auto fp = openAFile();
scope(exit) fclose(fp);
saySomethingToAFile(fp);
printf("Hello\n");
}
由于选择性
导入机制.如果删除导入,你正确获得:
dd(7)
:错误:未定义的saySomethingToAFile
标识符.
该方案
兼容C和D
声明规则,无大的命名空间惊喜
(编译器也应禁止
导入神奇的内部实现
模块,这样人们就不会直接戳它),并且,这可能是可行
的.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现