Calling D from C - What's the present status?
Bill Baxter
dnewsgroup at billbaxter.com
Sat Jan 20 06:33:29 PST 2007
Daniel Keep wrote:
> hauptmech wrote:
>> I'd like to maintain an internal (to my company) code library in D
>> but provide customers with a libxxx.a and *.h files so they can use C.
>>
>> I'd like to provide access to classes and members. My C library code
>> is more or less object oriented (ei pass in a pointer to data as the
>> first arg to a "member" function) so customers can deal with that.
>>
>> I read the short snippet that said functions attributed as extern(C)
>> can be called... and I vaguely rememeber experimenting a year ago and
>> being able to call class members with a little pointer abuse...
>>
>> Is there a compiler switch that will generate a nice *.h file?!?
>>
>> Or perhapse more reasonably; does anyone know of any projects out
>> there geared towards providing C bindings for D libraries in an
>> automated way?
>>
>> hauptmech
>
> AFAIK, there is no automated mechanism for generating .h files --
> historically, we've been more worried about calling back to C and C++
> than the other way around :)
>
> Here's what I *do* know on the subject:
>
> "extern(C)" lets you use perfectly normal C calling conventions. So,
> for example, if you compile this:
>
> extern(C) int add(int a, int b) { return a + b; }
>
> to an object file, and link it into a C program that has the following
> declaration somewhere:
>
> int add(int, int);
>
> Then it should all work as expected. The trouble comes in because of
> D's additional features such as the garbage collector (used by default
> for all heap allocations), module constructors/destructors, etc.
>
> As for exposing D classes to C, you would have to do what you would
> normally do with C++: build a "flat api" wrapper around the classes for
> C to use.
>
> I'm afraid I can't really offer anything more; if you check out the
> phobos source code (which comes with DMD), it contains the main function
> used by D programs (which in turn calls the main function defined in
> your code). This includes details on how to do things like start up the
> garbage collector and do initialisation, etc.
>
> Best of luck to you :)
>
> -- Daniel
Seems like there should be a single handy extern (C) function in phobos
to handle that standard startup and shutdown stuff. I've seen a couple
of D programs that do this manually (I think the most recent was one of
Kirk's PyD samples). Is there some reason that stuff can't just be
thrown in a single DRuntimeInit / DRuntimeClose pair of functions?
Tango folks?
--bb
More information about the Digitalmars-d-learn
mailing list