On Thursday, May 03, 2012 07:00:21 James Miller wrote: > I'm doing C bindings and I have an opaque struct and an extern'd > variable of the type of that struct. The problem is that dmd is > complaining that the struct has no definition (which is true). > Making it a pointer works (expected) but i can't do that because > the interface is expecting an full struct. > > Adding __gshared doesn't help. > > I assume this is bug, since usage of extern means that I don't > need to know the size, since it will be allocated in the C code, > not the D code.
If you're putting the struct on the stack, then you need the struct's definition. That's true in C/C++ as well as in D. You can get away without having the definitions to its _functions_, but you need the definition for the struct itself. The only time that you escape this is via pointers. And I don't know how you can talk about the struct as being allocated in the C code if it's on the stack, except perhaps if it has pointers as member variables, in which case it's the memory for those member variables which is allocated in the C code. The entire struct is copied every time that it's passed to anything - unless you're using pointers, which you say you aren't. - Jonathan M Davis