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