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的主要内容,如果未能解决你的问题,请参考以下文章

vs2019中导入GMP

在 Anaconda Python 中导入自己的模块

在 Objective C 文件中导入 ViewController.swift

如何在swift中导入Objective c文件

如何在swift中导入Objective c文件

如何构建在unity/c#中导入的c++ dll