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