C.h to D conversion (structs)
Chris via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Mar 15 13:14:13 PDT 2016
On Tuesday, 15 March 2016 at 18:47:22 UTC, Adam D. Ruppe wrote:
> Like you would another D library.
Now I get it! Yes, that works as expected.
>
> The problem isn't the struct itself, but the D initializer.
> Structs in C don't have initalizers but do in D:
>
> struct Foo {
> int a = 10; /* illegal in C, legal in D */
> };
>
>
> Note that extern(C) doesn't actually do anything on a struct,
> it really only applies to functions and global variables.
That's where I got it wrong!
> D realizes this by creating a variable called
> _DStructName__init which has the initial value of the struct.
> When you make a variable of that type, it copies the value of
> this hidden init thing over to your new variable to initialize
> it. C does nothing of the sort, so the C library will not
> provide this - you need to link in the one from D.
>
>
> You might be thinking "but I don't use = anything in this
> struct", but there's a few places where D will put one in
> automatically:
>
> float and double = NaN by default
> char, wchar, and dchar = -1 (well, 0xff) by default
>
> And everything else =0 (or null) by default.
>
>
> If *everything* in a struct is initialized to 0, the __init
> variable is left out and memset(&struct, struct.sizeof, 0) is
> called instead.
>
> But if *anything* in there is non-zero, the __init variable is
> created and referenced when you declare the variable (unless
> you =void it at the usage point).
>
>
> Which causes the undefined reference problem you're seeing -
> the usage code is trying to initialize, but the C library
> doesn't provide that (since it isn't a C feature) and the D
> library isn't linked in.
Thanks a million! Now I understand why it didn't work with my
implementation.
[snip]
More information about the Digitalmars-d-learn
mailing list