On Tuesday, 8 July 2014 at 10:47:26 UTC, NoUseForAName wrote:
Also side question. What are these .di files? D propaganda radio told me that D does not need header files because it has a real module system (like e.g. Pascal or Go) yet in the solution Ali posted these .di files seem to be.. pretty much like C header files.

They are optional, for those situations when you don't want to distribute the entire source code (e.g. proprietary library distributed in binary form). They are usually auto-generated by the compiler (dmd -H), and I agree that it's awkward to have to define them manually.

So I could just put..

public struct S;

private struct S
{
    int i;
}

.. in the .d file and that would work? I mean I expected something like this but then why would Ali post such a complex solution?

I guess because it's a (the only?) way to get real incomplete types. It is the most "literal" translation of what you described. But of course, there are better ways to achieve what you actually want.

Your example above doesn't work, because it would be interpreted as a redefinition of the struct. Instead, you can use a public alias to a private type:

// my_module.d:

private struct MyStructImpl {
    int x;
}

public alias MyStructPtr = MyStructImpl*;

void doSomething(MyStructPtr foo) {
    ...
}

// my_main_program.d:

MyStructPtr bar;    // OK
MyStructImpl foo;   // Error: my_module.MyStructImpl is private

Reply via email to