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放在以下目录:

image

        使用vs2015新建工程,如下图:

image        设置LDC路径:(工具-->选项-->项目和解决方案)

         image

         设置使用LDC编译器:(工程属性-->General)

        image

         使用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:
");
        printf("%s
",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;
}

       image 

二、测试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:
");
        printf("%s
",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;
}

     编译运行:

image

       能编译通过,也能运行,只是不是想要的结构,具体问题还需要分析。。。。。。

三、测试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
",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;
}

编译运行:

      image      搞定运行成功。

原文地址:https://www.cnblogs.com/wanhongnan/p/5790605.html