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

How Do I Pass Strings Between D and C++?

我尝试修改这个答案...

...所以我将 C++ 字符串传递给 D,然后 return 它返回“-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++ 文件以使其正确传递此值并正确接收它。

D 字符串是具有 char*size_t 长度的结构。这与 std::string

不兼容

避免这种情况的一种常见方法是恢复到 C 风格 API 设计,您可以在其中直接传递 char* 和长度。

这也意味着您必须小心分配和释放,因为 D 分配器不直接与 C++ 分配器兼容,并且 C++ 内存中的指针不会被 D 的垃圾收集扫描。

您可以使用 std.string.toStringz 从 D 传递一个 C 以 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);
}

这个问题已经在SO上被问过很多次了。我认为这里给出了最好的答案之一:

注意:毫无疑问,答案是与 C 相关的,但它也可以应用于 C++。