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路径:(工具-->选项-->项目和解决方案)

设置使用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;
}

编译运行:

      搞定运行成功。

时间: 2024-12-18 02:04:42

D语言调用C++中的std::string的相关文章

MFC exe使用C++ dll中的std::string 崩溃

VC6中 MFC exe中 new 纯C++ dll dll 崩溃 我把纯C++的 dll,用/MTd 换成/MDd,就可以了 版权声明:本文为博主原创文章,未经博主允许不得转载.

03_Android NDK中C语言调用Java代码,javah的使用,javap的使用以及生成签名,Android.mk的编写,C代码的编写

?? 1  案例场景,通过C语言回调Java的代码,案例的最终界面: 2  案例的代码结构如下: 3 编写DataProvider的代码: package com.example.ndkcallback; public class DataProvider { //C调用java空方法 public void helloFromJava(){ System.out.println("哈哈哈  我被调用了"); } //C调用java中的带两个int参数的方法 public int Ad

【转】标准C++类std::string的内存共享和Copy-On-Write技术

1.             概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书.这就是"拖延战术",直到你非要做的时候才去做. 当然,这种事情在现实生活中时往往会出事,但其在编程世界中摇身一变

[C++]using std string;的作用是什么

相关资料: http://bbs.csdn.net/topics/330194465 #include <string>将string库包含到当前编译单元中. using std::string; 一个编译单元会有很多域...一般,这个只会出现在单独的域中.这样做是避免三件事.1, 将std里的所有名字暴露在各个域中, 例如 把using namespace std; 写在全局中.2, 在using std::string的域中,就可以直接使用string, 少打std::了,图方便

Linux系统下C语言如何调用scalapack中的函数

在并行计算中经常需要调用scalapck(并行化的lapack)函数库里面的函数进行编程,这里简单介绍在C语言如何调用scalapck中的矩阵向量乘的函数. 注意:scalapack中的函数是用fortran写的,矩阵是按列进行存储的. scalapack的链接需要用到blas,因此确保本机上安装好了blas.gfortran 下面是一个矩阵向量乘法的例子(为了简单计算,该程序中设定进程数为4): #include <stdio.h> #include <string.h> #in

有关C++ std::string 类的类型转换 其他语言永远无法理解的伤

最近做了个项目,C++的MFC窗口程序,一个基于dialog的学生-图书管理系统,有一些感触,最后会放上一些项目截图和部分代码提供大家参考.如果有什么好方法和建议欢迎指导. 强类型,为什么这么伤 我知道强类型是很必要的,但是最近使用的都是一些弱类型的语言,到回来使用C++的时候还真是很不习惯.std::string在学的时候就知道了,好用但还是跟c标准char[]有很大区别的,MFC编程中又加入了没有学过的Cstring和LPSTR.LPWSTR等,下面我就来分享一下一些有关类型转换的感受. 什

Mysql: Connect/C++ 使用过程中发现返回 std::string 造成的内存泄露

在使用 Connect/C++ ,测试时发现在调用 getString 出现了内存增长的情况. ConstructOutput(); //打印出当前内存 for(int i=0;i<1000;++i) { prepareState.reset(con->prepareStatement("call test.testproc3(?)")); prepareState->setInt(1,1001); prepareState->executeUpdate();

4.std::string中库函数的使用。

为了美观,我们把输入和输出设计成如下: #include <iostream> #include <string> int main() { std::string name; std::string s3,s2; std::cout << "Please enter your first name: "; std::cin >> name; s3 = "* Hello, " + name + "! *&qu

实战c++中的string系列--std::string与MFC中CString的转换

搞过MFC的人都知道cstring,给我们提供了很多便利的方法. CString 是一种很有用的数据类型.它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多.不管怎样,使用CString有很多特殊的技巧,特别是对于纯C背景下走出来的程序员来说有点难以学习. 但是很多情况下,我们还是需要cstring和string的转换. 分两步: 1把cstring转为char数组 2根据char数组,构造自己的string(记得释放内存) std::string CStringT