Passing string from D to c++

John Colvin john.loughran.colvin at gmail.com
Tue Jul 30 15:01:15 PDT 2013


On Tuesday, 30 July 2013 at 20:22:46 UTC, Milvakili wrote:
> On Tuesday, 30 July 2013 at 20:17:34 UTC, John Colvin wrote:
>> On Tuesday, 30 July 2013 at 20:09:01 UTC, Milvakili wrote:
>>> On Tuesday, 30 July 2013 at 20:02:51 UTC, Dicebot wrote:
>>>> On Tuesday, 30 July 2013 at 19:52:44 UTC, Milvakili wrote:
>>>>> I'm linking D with C++ lib.a file.  When the C++ function 
>>>>> has compatible data types I can call them from D.  But when 
>>>>> I changed the parameter to string I got bunch of errors.
>>>>>
>>>>> Data Type Compatibility table does not include strings.  Is 
>>>>> there a way of passing strings?
>>>>
>>>> http://dlang.org/phobos/std_string.html#.toStringz
>>>
>>>
>>> So I need to pass them as char*, I can not pass them as 
>>> string?
>>
>> Correct.
>>
>> Just thinking off the top of my head: you could probably hack 
>> something together though with a struct and casting.
>
> Thanks.  Is there any work in progress related to string 
> passing?
> I think string passing should be solved automatically.
>
> Coz otherwise one need to write wrapper for each c++ function 
> that has a string parameter.
>
> thanks.

I had a crack at making this work, but I'm stuck on some basics 
and I don't know a great deal about c++ really

//inter.cpp
#include<string>
#include<iostream>
using namespace std;

void printString(string* s)
{
     cout << s << "\n";
}

string *strD2Cpp(char *ptr, unsigned long long length)
{
     return new std::string(ptr, length);
}

//inter.d
extern(C++)
{
     interface CppString{}
     CppString strD2Cpp(char* ptr, size_t length);
     void printString(CppString s);
}

void main()
{
     string s = "2432qreafdsa";
     auto s_cpp = strD2Cpp(s.dup.ptr, s.length);
     printString(s_cpp);
}

$ dmd -c -m64 inter.d
$ g++ -c -m64 inter.cpp -ointercpp.o
$ g++ inter.o intercpp.o -ointer -lphobos2
inter.o: In function `_Dmain':
inter.d:(.text._Dmain+0x48): undefined reference to 
`printString(CppString*)'
collect2: error: ld returned 1 exit status


Is this an incompatibility between dmd and g++? I'm on linux x64

How come it's happy to have CppString as the return type of 
strD2Cpp but not as a parameter to printString?

Also, using size_t in inter.cpp caused linker errors, hence the 
unsigned long long.


More information about the Digitalmars-d mailing list