如何在D和C ++之间传递字符串?

时间:2015-12-11 09:44:04

标签: c++ string d

我尝试调整这个答案......

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 ++文件以使其正确传递此值并正确接收它。

3 个答案:

答案 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 ++。