Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
June 26, 2011 Interfacing to C. extern (C) variables | ||||
---|---|---|---|---|
| ||||
Hi. I try to interface D module with C one. See: * file test.c: #include <stdio.h> int c_var; int func() { c_var = 1234; printf("In C\n"); printf("c_var = %d\n", c_var); printf("&c_var = %x\n", &c_var); return 0; } * file unit.d: module unit; import std.stdio; extern(C){ int c_var; int func(); } void main() { func(); writeln("In D"); writefln("c_var = %d", c_var); writefln("&c_var = %x", &c_var); } And compile: dmc -c test.c dmd unit.d test.obj I'd like to call C functions and use C variables in D module. D calls C functions just fine, but how can I use C variables? This program outputs: In C c_var = 1234 &c_var = 45d004 In D c_var = 0 &c_var = 14298c |
June 26, 2011 Re: Interfacing to C. extern (C) variables | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alex_Dovhal | On 26/06/2011 20:54, Alex_Dovhal wrote: > I'd like to call C functions and use C variables in D module. > D calls C functions just fine, but how can I use C variables? extern(C) extern int myCVar; -- Robert http://octarineparrot.com/ |
June 26, 2011 Re: Interfacing to C. extern (C) variables | ||||
---|---|---|---|---|
| ||||
Posted in reply to Robert Clipsham | "Robert Clipsham" <robert@octarineparrot.com> wrote: > On 26/06/2011 20:54, Alex_Dovhal wrote: >> I'd like to call C functions and use C variables in D module. D calls C functions just fine, but how can I use C variables? > > extern(C) extern int myCVar; Thanks for answer. I've already tried that, it doesn't work for some reason: * file unit2.d: module unit; import std.stdio; extern(C) int func(); extern(C) extern int c_var; void main() { func(); writeln("In D"); writefln("c_var = %d", c_var); writefln("&c_var = %x", &c_var); } Result: In C c_var = 1234 &c_var = 470200 In D object.Error: Access Violation ---------------- 426DA4 426C1B 405BEB 4057E7 451099 ---------------- Found workaround, but it's extreme hack: *file test.c #include <stdio.h> int c_var; //int* ref_c_var() //{ // return &c_var; //} #define REF_DECL(type, name) type* ref_ ## name () {return &name;} REF_DECL(int, c_var) int func() { c_var = 1234; printf("In C\n"); printf("c_var = %d\n", c_var); printf("&c_var = %x\n", &c_var); return 0; } *file: unit1.d: module unit; import std.stdio; extern(C) int func(); string C_VAR(string type, string name) { return "extern (C) "~ type ~ "* ref_" ~ name ~ "();"~ " " ~ "ref " ~ type ~ " " ~ name ~"(){return *ref_"~name~"();}"; } mixin(C_VAR("int", "c_var")); void main() { func(); writeln("In D"); writefln("c_var = %d", c_var); writefln("&c_var = %x", &c_var); } |
June 26, 2011 Re: Interfacing to C. extern (C) variables | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alex_Dovhal Attachments:
| On Sun, Jun 26, 2011 at 5:00 PM, Alex_Dovhal <alex_dovhal@yahoo.com> wrote:
> "Robert Clipsham" <robert@octarineparrot.com> wrote:
> > On 26/06/2011 20:54, Alex_Dovhal wrote:
> >> I'd like to call C functions and use C variables in D module. D calls C functions just fine, but how can I use C variables?
> >
> > extern(C) extern int myCVar;
>
> Thanks for answer. I've already tried that, it doesn't work for some reason:
>
> * file unit2.d:
> module unit;
> import std.stdio;
> extern(C) int func();
> extern(C) extern int c_var;
>
> void main()
> {
> func();
> writeln("In D");
> writefln("c_var = %d", c_var);
> writefln("&c_var = %x", &c_var);
> }
>
> Result:
> In C
> c_var = 1234
> &c_var = 470200
> In D
> object.Error: Access Violation
> ----------------
> 426DA4
> 426C1B
> 405BEB
> 4057E7
> 451099
> ----------------
>
>
> Found workaround, but it's extreme hack:
>
> *file test.c
> #include <stdio.h>
> int c_var;
> //int* ref_c_var()
> //{
> // return &c_var;
> //}
>
> #define REF_DECL(type, name) type* ref_ ## name () {return &name;}
>
> REF_DECL(int, c_var)
>
> int func()
> {
> c_var = 1234;
> printf("In C\n");
> printf("c_var = %d\n", c_var);
> printf("&c_var = %x\n", &c_var);
> return 0;
> }
>
> *file: unit1.d:
> module unit;
> import std.stdio;
>
> extern(C) int func();
>
> string C_VAR(string type, string name)
> {
> return
> "extern (C) "~ type ~ "* ref_" ~ name ~ "();"~
> " " ~ "ref " ~ type ~ " " ~ name ~"(){return *ref_"~name~"();}";
> }
>
> mixin(C_VAR("int", "c_var"));
>
> void main()
> {
> func();
> writeln("In D");
> writefln("c_var = %d", c_var);
> writefln("&c_var = %x", &c_var);
> }
>
>
>
It works for me like this:
extern(C){
__gshared int c_var;
int func();
}
|
Copyright © 1999-2021 by the D Language Foundation