Thread overview | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
June 11, 2014 Basics of calling C from D | ||||
---|---|---|---|---|
| ||||
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? |
June 11, 2014 Re: Basics of calling C from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to belkin | On Wednesday, 11 June 2014 at 13:52:09 UTC, belkin wrote:
> Question: How do I use it from D?
Write the prototype in your D file with extern(C):
extern(C) int factorial(int n);
then just call the function normally in D. Make sure you include all the C object files when you compile the D program too so it all links together.
|
June 11, 2014 Re: Basics of calling C from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to belkin | 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. |
June 11, 2014 Re: Basics of calling C from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On 06/11/2014 03:54 PM, Adam D. Ruppe wrote:
> On Wednesday, 11 June 2014 at 13:52:09 UTC, belkin wrote:
>> Question: How do I use it from D?
>
> Write the prototype in your D file with extern(C):
> extern(C) int factorial(int n);
>
> then just call the function normally in D. Make sure you include all the
> C object files when you compile the D program too so it all links together.
I believe the correct answer should be "Buy my book!".
|
June 11, 2014 Re: Basics of calling C from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to simendsjo | On Wednesday, 11 June 2014 at 14:11:04 UTC, simendsjo wrote: > I believe the correct answer should be "Buy my book!". ah, of course! I should just make a .sig file lol http://www.packtpub.com/discover-advantages-of-programming-in-d-cookbook/book chapter 4 talks about this kind of thing :P |
June 11, 2014 Re: Basics of calling C from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | 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?
|
June 11, 2014 Re: Basics of calling C from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Wednesday, 11 June 2014 at 14:22:51 UTC, Adam D. Ruppe wrote:
> On Wednesday, 11 June 2014 at 14:11:04 UTC, simendsjo wrote:
>> I believe the correct answer should be "Buy my book!".
>
> ah, of course! I should just make a .sig file lol
>
> http://www.packtpub.com/discover-advantages-of-programming-in-d-cookbook/book
>
> chapter 4 talks about this kind of thing :P
Thanks. This book is on my "To Buy" list.
|
June 11, 2014 Re: Basics of calling C from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On 06/11/2014 04:22 PM, Adam D. Ruppe wrote:
> On Wednesday, 11 June 2014 at 14:11:04 UTC, simendsjo wrote:
>> I believe the correct answer should be "Buy my book!".
>
> ah, of course! I should just make a .sig file lol
>
> http://www.packtpub.com/discover-advantages-of-programming-in-d-cookbook/book
>
>
> chapter 4 talks about this kind of thing :P
Yeah, I was skimming through that chapter just minutes before I saw this post :) I must say I really like your writing-style as well as the down-to-earth and precise and concise presentation of the material. So kudos to you!
Really looking forward to reading some of the more advanced material as well as seeing your dconf presentation.
|
June 11, 2014 Re: Basics of calling C from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to belkin | 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
|
June 11, 2014 Re: Basics of calling C from D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Colin | On Wednesday, 11 June 2014 at 15:14:19 UTC, Colin wrote: > 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 And here: http://dlang.org/interfaceToC.html |
Copyright © 1999-2021 by the D Language Foundation