如何在 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++。
我尝试修改这个答案...
...所以我将 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++。