www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Interfacing with C - calling member function of D struct from C?

reply unleashy <lakeavenger gmail.com> writes:
Hello! If I have a D struct like:

struct Foo
{
     int bar;

     void addToBar(int what) {
         bar += what;
     }
}

How would I call `addToBar` from C code? Would I need to put the 
`addToBar` function outside of the struct and mark it as `extern 
(C)` and in normal D code take advantage of UFCS or is there some 
magic C incantation?

I've scoured the forums and other places for anything about this 
but couldn't find any information whatsoever... so yeah. (or my 
Google-fu is terrible)

Thanks!
Jun 24
parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Sunday, 25 June 2017 at 02:05:35 UTC, unleashy wrote:
 How would I call `addToBar` from C code?
You don't. Instead write it like: struct Foo { int bar; } extern(C) void addToBar(Foo* foo, int what) { foo.bar += what; } Then define it in C the same way and you call it the normal way from C. But from D, you can UFCS call it: Foo* foo = new Foo(); foo.addToBar(5); // cool though I'd prolly just call it from D the same way you do from C too.
Jun 24
parent unleashy <lakeavenger gmail.com> writes:
On Sunday, 25 June 2017 at 02:09:53 UTC, Adam D. Ruppe wrote:
 On Sunday, 25 June 2017 at 02:05:35 UTC, unleashy wrote:
 How would I call `addToBar` from C code?
You don't. Instead write it like: struct Foo { int bar; } extern(C) void addToBar(Foo* foo, int what) { foo.bar += what; } Then define it in C the same way and you call it the normal way from C. But from D, you can UFCS call it: Foo* foo = new Foo(); foo.addToBar(5); // cool though I'd prolly just call it from D the same way you do from C too.
Thank you, this is what I suspected :)
Jun 25