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