Opaque structs
    Andrej Mitrovic 
    andrej.mitrovich at gmail.com
       
    Thu Jun 27 18:40:31 PDT 2013
    
    
  
Traditionally using opaque structs in D when interfacing with C (where
one should only ever use such structs with a pointer) are implemented
like so:
-----
struct S;
void main()
{
    S* s1;  // ok
    S s2;  // linker error
}
-----
Unfortunately this tends to spawn unreadable error messages:
-----
test.d(3): Error: struct test.S unknown size
test.d(3): Error: struct test.S no size yet for forward reference
test.d(3): Error: struct test.S unknown size
test.d(3): Error: struct test.S no size yet for forward reference
test.d(12): Error: variable test.main.s2 no definition of struct S
test.d(3): Error: struct test.S unknown size
test.d(3): Error: struct test.S no size yet for forward reference
-----
I was thinking we could also implement opaque structs like so:
-----
struct S
{
    @disable this();
    @disable this(this);
}
void main()
{
    S* s1;
    S s2;
}
-----
The error is then:
-----
Error: variable test.main.s2 initializer required for type S
-----
The question is, is a disabled ctor and postblit enough?
Note that if we implement Issue 8728[1], we could even create a better
error message via:
-----
struct S
{
    @disable("S is an opaque C type and must only be used as a pointer")
    this();
    @disable("S is an opaque C type and must only be used as a pointer")
    this(this);
}
void main()
{
    S* s1;  // ok
    S s2;  // user error
}
-----
[1] : http://d.puremagic.com/issues/show_bug.cgi?id=8728
    
    
More information about the Digitalmars-d-learn
mailing list