d不同c文件中导入c
Posted fqbqrr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 :, printf, fclose, openAFile;
//...
module b2;
// 再次公共选择性导入
public import magic :, 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
声明规则,无大的命名空间惊喜
(编译器也应禁止
导入神奇的内部实现
模块,这样人们就不会直接戳它),并且,这可能是可行
的.
以上是关于d不同c文件中导入c的主要内容,如果未能解决你的问题,请参考以下文章