D语言调用C++中的std::string
在D语言中调用C++中的std::string , 需要使用 extern(C++,class)语法,该语法在DMD2.071版本中不支持,需要使用ldc1.1。
下载地址:https://github.com/ldc-developers/ldc/releases/ 。 下载ldc2-1.1.0-alpha1-win32-msvc.zip
使用LDC2-1.1时,必须使用vs2015库文件,因为连接时需要。
下面使用visuald来测试一下调用std::string.
解压开LDC放在以下目录:
使用vs2015新建工程,如下图:
设置使用LDC编译器:(工程属性-->General)
使用Ldc编译32位程序不需要设置ms-coff格式,因为他就是使用ms-coff格式。
一、测试string*的调用 (完全正常)
test.cpp
#include <stdio.h> #include <iostream> #include <string> using namespace std; extern "C++"{ string* getStdString(){ return new string("Hello std::string"); } void printStdString(string* str){ printf("str:\r\n"); printf("%s\r\n",str->c_str()); } }
std.d
module stl; extern(C++,std) { extern(C++,class) struct allocator(CharT); struct char_traits(CharT){} extern(C++,class) struct basic_string(CharT, CharTraits = char_traits!(CharT) , Allocator = allocator!(CharT)){} } extern(C++) { alias String = std.basic_string!(char); void printStdString(String* str); String* getStdString(); } void test() { auto str = getStdString(); printStdString(str); }
main.d
import std.stdio; import stl; int main(string[] argv) { test(); readln(); return 0; }
二、测试string&的调用 (结果不正常)
test.cpp
#include <stdio.h> #include <iostream> #include <string> using namespace std; extern "C++"{ string& getStdString(){ return string("Hello std::string"); } void printStdString(string& str){ printf("str:\r\n"); printf("%s\r\n",str.c_str()); } }
stl.d
module stl; extern(C++,std) { extern(C++,class) struct allocator(CharT); struct char_traits(CharT){} extern(C++,class) struct basic_string(CharT, CharTraits = char_traits!(CharT) , Allocator = allocator!(CharT)){} } extern(C++) { alias String = std.basic_string!(char); void printStdString(ref String str); ref String getStdString(); } void test() { auto str = getStdString(); printStdString(str); }
main.d
import std.stdio; import stl; int main(string[] argv) { test(); readln(); return 0; }
编译运行:
能编译通过,也能运行,只是不是想要的结构,具体问题还需要分析。。。。。。
三、测试string*的c_str()方法的调用 (完全正常)
调用string的c_str()方法
test.cpp
#include <stdio.h> #include <iostream> #include <string> using namespace std; extern "C++"{ string* getStdString(){ return new string("Hello std::string"); } void printStdString(string* str){ printf("C++ output: %s\r\n",str->c_str()); } }
stl.d
module stl; extern(C++,std) { extern(C++,class) struct allocator(CharT); struct char_traits(CharT){} extern(C++,class) struct basic_string(CharT, CharTraits = char_traits!(CharT) , Allocator = allocator!(CharT)) { extern (C++) public const const(CharT)* c_str(); } } extern(C++) { alias String = std.basic_string!(char); void printStdString(String* str); String* getStdString(); }
main.d
import std.stdio; import stl; import std.string; void test() { auto str = getStdString(); auto dstr = fromStringz(str.c_str()); printStdString(str); writeln("D output: ",dstr); } int main(string[] argv) { test(); readln(); return 0; }
编译运行: