• 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      搞定运行成功。

  • 相关阅读:
    linux设备驱动程序第3版学习笔记(例程3--scull)未完1
    linux设备驱动程序第3版学习笔记(例程2--hellop.c)
    linux设备驱动程序第3版学习笔记(例程1)
    Intellij中request等对象无法解析
    OneNote学习笔记----语言概述
    四、归并排序(mergesort)
    三、堆排序(Heapsort),优先队列可以用于O(N log N)
    二、希尔排序(Shellsort)-- 缩减增量排序(diminishing increment sort)
    一、插入排序(insertion sort)
    hashmap冲突的解决方法以及原理分析:
  • 原文地址:https://www.cnblogs.com/wanhongnan/p/5790605.html
Copyright © 2020-2023  润新知