On Sun, Jun 26, 2011 at 5:00 PM, Alex_Dovhal <alex_dov...@yahoo.com> wrote:
> "Robert Clipsham" <rob...@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(); }