Passing opaque struct between functions/modules
Ali Çehreli
acehreli at yahoo.com
Wed Jan 23 09:14:31 PST 2013
On 01/23/2013 08:33 AM, Sarath Kumar wrote:
> Can someone please tell me the right way to pass an opaque object
> between module's functions.
I am assuming that you are interfacing with a C library. That library
must have a D binding file. I am assuming that it is your libA.d:
// libA.d
module libA;
extern (C)
{
struct Opaque;
Opaque* getObject();
void doSomething(Opaque *);
}
There is also a library that implements the struct and the functions.
Although you would have it in the C library, here is a D module to
imitate it:
// libA_impl.d
// These are presumably defined in a C library. Simply imitating it with
this
// D module
extern (C)
{
struct Opaque
{
int i;
double d;
}
Opaque* getObject()
{
return new Opaque(42, 1.5);
}
void doSomething(Opaque *)
{}
}
Here is the D module that makes use of that library by importing its D
binding:
// libB.d
module libB;
import libA;
void doAction(Opaque* o)
{
doSomething(o);
}
void main()
{
Opaque* o = getObject();
doAction(o);
}
Here is how to build the program:
$ dmd libA.d libB.d libA_impl.d -ofmy_prog
Note that normally libA_impl.d would not be included. Instead, the C
library would be used. For example, if we are talking about a libmy_c_lib.a:
$ dmd libA.d libB.d -L-lmy_c_lib -ofmy_prog
Yes, with the confusing -L in there. ;)
Ali
More information about the Digitalmars-d-learn
mailing list