IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> d中绑定C++的常 -> 正文阅读

[C++知识库]d中绑定C++的常

原文
Jan:在D中有个extern(C++)类:

extern(C++) class A
{
    ~this();
    // ...
}

及一个带const引用A的函数:

void CppFunc(const A& arg);

我该如何在D中绑定它?

extern(C++) void CppFunc(A arg); // 按A*传递
extern(C++) void CppFunc(ref const(A) arg);
// 按'A const * const &'传递

按D中声明解决了其他类类似问题,但仅针对无虚函数类.我现在有个确实需要在D端用类C++类,把对象传递给C++时遇到了问题.


evilrat:
可用extern(C++,struct)告诉编译器构/类混杂.

extern (C++, struct) //即使它是类,也用构混杂
class SomeDClass
{
 ...
}

试了,但不管用,因为似乎D是按D中而不是C++类/构来决定如何传递对象.因此,即使按你的改了,仍按前面指针传递.
Ola,这有用吗?

extern(C++) class _A {}
extern(C++) struct A {}

extern(C++) void CppFunc(ref const(A) arg);

void func(_A a){
    CppFunc(*cast(A*)a);
}

evilrat:
仅当该构与类内存布局匹配时,唯一潜在问题是C++端的构造器.
此外,C++类可能有非0初化且由于对齐字节间隙,这会破坏,包括(默认)等价运算符等.要非常小心.


ola:是的,我不想用它,也许手动混杂更好,但仍很痛苦.常 A&C++API中很普遍,真应开箱即用的支持它.只需在D规范中加个如ref const(@deref(A))解引用类型构造器.
jan:我完全同意.这种模式在C++中非常普遍,我很惊讶D无法做到这一点.与C++链接的整个想法轻松互操作,小摩擦,高性能.
对按参数或返回类型传递的类,更改混杂尾常,但会破坏许多代码.提案,加解引用类型构造器提案也允许尾常类.


jan:解引用,D尝试对C++应用类指针/引用语义,即使它可按不同方式.'Deref'只能解决该(常见)问题.但是,在C++中,按值的类也很常见.也许可给D编译器提供提示.
如果我有如下C++代码:

class A { ... };
void AsValue(A value);
void AsPtr(A* value);
void AsConstPtr(const A* value);
void AsRef(A& value);
void AsConstRef(const A& value);

我认为,目前只能绑定到"AsPtr“和”AsConstPtr"形式函数.如果按D中构声明A,可绑定到其他,但有时不行.

D中,如何用""关键字按值类型传递给函数?

extern(C++) class A { ... }
extern(C++) void AsValue(struct A value);
extern(C++) void AsPtr(A value); // 同上
extern(C++) void AsPtr(struct A* value); // 同上
extern(C++) void AsConstPtr(const(A) value);
extern(C++) void AsConstPtr(const(struct A*) value); // 同上
extern(C++) void AsRef(ref struct A value);
extern(C++) void AsConstRef(const(ref struct A) value); // 同上

这里"“关键字告诉编译器与C++一样,按值类型对待A,因此与C++同样应用指针,常量和引用语义.此外,如果遇到纯”A 构",编译器需要类似构在栈上创建对象副本,并传递给C++(可能会修改临时对象).实现可能难,但始终可传递类C++.额外好处不应改变现有行为,因此无破坏.
前面cast方法不行,


tim:最简单方法可能是手动设置混杂:

pragma(mangle, "_Z7CppFuncRK1A")
extern(C++) void CppFunc(const A arg);
//针对Itanium,林操,对窗口不一样.

tim:D与C++交互方式是合理且非常有用的.链接兼容性大有帮助.
C++不同,D变量默认有线程本地存储,要链接C++全局变量,要在D中用__gshared(类似共享,但由程序员(而非编译器)保证同步)存储修饰符,

module a;
struct Foo {}
extern(C++)
__gshared Foo globalFoo;

我已成功使用了来自DLL的全局变量.DMD现在也测试了C++DLL:地址

C++中应该这样声明变量:

__declspec(dllexport) int value;

然后D这样访问它:

extern (C++) export extern __gshared int value;

你有你问题的测试用例吗?
jan:

class Test
{
public:
  __declspec(dllexport) static int var;
};
//也试了不带extern(C++),及不带export
int Test::var = 42;
//D端
extern(C++, class) struct Test
{
  extern (C++) export extern __gshared int var;
}

dmd报错:

error LNK2019: unresolved external symbol "public: static int Test::var" (?var@Test@@2HA)

我检查了DLL定义符号的.exp文件,名字完全相同.是的,我大致正确链接到该DLL,DMD链接该DLL其他符号也很好.

tim:我可重现你的问题.如果var的,似乎可工作:

extern(C++, class) struct Test
{
   extern (C++) export extern static __gshared int var;//加个静
}

无静就无法工作,这可能是个错误.文档说也可应用__gshared成员变量和局部变量.此时,__gshared除了全局共享而非线程本地共享,与等价.

extern export __gshared static int var;
//`外`时为啥要导出?

确实工作了.__gsharedD中为?

H.S:
不.此时,:生命期是模块生命期.默认,静态变量TLS中,有实例化它的线程生命期(且每线程一实例).
要用__gshared来使编译器按C/C++意义对待全局变量,即所有线程中只有1个实例.C 静==D __g共享.

tim:我同意__gshared应暗示静态.可能是编译器错误.
不带导出,仅适用于(在Windows上)静态链接.与在C++中的__declspec(dllexport)一样,不带的导出会导出其他变量.与__declspec(dllimport)一样,组合导出来导入变量.

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-18 15:47:14  更:2021-12-18 15:48:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:09:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码