Interfacing to C. extern (C) variables
Alex_Dovhal
alex_dovhal at yahoo.com
Sun Jun 26 15:00:44 PDT 2011
"Robert Clipsham" <robert at 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);
}
More information about the Digitalmars-d-learn
mailing list