我尝试调整这个答案......
https://stackoverflow.com/a/26924384/105539
...所以我将一个C ++字符串传递给D然后用“-response”返回它,但它无法编译D文件:
// dtest.d
extern (C++) string dfunc(string s) {
return s ~ "response";
}
$ dmd -c dtest.d
Error: Internal Compiler Error: unsupported type string
dmd: cppmangle.c:576: virtual void CppMangleVisitor::visit(Type*): Assertion `0' failed.
Aborted (core dumped)
然后,我不知道如何编写C ++文件以使其正确传递此值并正确接收它。
答案 0 :(得分:3)
您可以使用std.string.toStringz
从D传递以null结尾的字符串。以同样的方式有std.string.fromStringz
:
extern (C++) immutable(char)* dfunc(const char* s) {
import std.string;
return toStringz(fromStringz(s) ~ "response");
}
然后是C ++中的调用者
#import <Cocoa/Cocoa.h>
char *dfunc(const char *);
extern "C" int rt_init();
extern "C" int rt_term();
int main(int argc, const char * argv[]) {
const char *sTest = "request";
rt_init();
NSLog(@"Result=%s",dfunc(sTest));
rt_term();
return NSApplicationMain(argc, argv);
}
答案 1 :(得分:2)
D字符串是一个char*
和size_t
长度的结构。这与std :: string
避免这种情况的一种常见方法是恢复为C风格API设计,您可以直接传递char *和长度。
这也意味着你必须要小心分配和释放,因为D分配器与C ++分配器不直接兼容,并且D ++的垃圾收集不会扫描C ++内存中的指针。
答案 2 :(得分:0)
这个问题已多次被问过SO。我认为这里给出了最好的答案之一:https://stackoverflow.com/a/6405870/876497
注意:请放心,答案是C相关的,但它也可以应用于C ++。