Basics of calling C from D

Colin via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jun 11 08:14:18 PDT 2014


On Wednesday, 11 June 2014 at 14:28:49 UTC, belkin wrote:
> On Wednesday, 11 June 2014 at 14:02:08 UTC, John Colvin wrote:
>> On Wednesday, 11 June 2014 at 13:52:09 UTC, belkin wrote:
>>> Example: I have this C function that is compiled into a 
>>> library
>>>
>>> //File: factorial.h
>>> int factorial(int n);
>>>
>>>
>>> //File: factorial.c
>>> #include "factorial.h"
>>>
>>> int factorial(int n)
>>> {
>>>   if(n!=1)
>>>    return n*factorial(n-1);
>>> }
>>>
>>> Question: How do I use it from D?
>>
>> //File: blah.d
>>
>> extern(C) int factorial(int n); //coincidentally identical to 
>> the C declaration.
>>
>> void main()
>> {
>>    assert(factorial(3) == 6);
>> }
>>
>>
>> $ gcc -c factorial.c -ofactorial.o
>> $ dmd blah.d factorial.o
>> $ ./blah
>>
>> or
>>
>> $ gcc -c factorial.c -ofactorial.o
>> $ ar rcs libfactorial.a factorial.o
>> $ dmd blah.d -L-lfactorial
>> $ ./blah
>>
>>
>>
>> Basically, you just translate the header files from C to D, 
>> then link to the C implementation. See 
>> http://code.dlang.org/packages/dstep for automatic translation 
>> of headers.
>
> This is great.
> How practical (reliable ) is it to translate a large and 
> complex header file like oci.h ( the interface for Oracle's 
> database API ) to D?

You can do a lot of it by simply doing a find and replace in the
file.
For example, all C definitions of:
unsigned char x
become:
ubyte x

So a find an replace will do that for you quite easily.
Other things like structs and typedefs are a bit more difficult
to do with a find & replace.
All the info you need is here anyway:
wiki.dlang.org/Bind_D_to_C


More information about the Digitalmars-d-learn mailing list