Let's say I have some C headers that have code like this in: extern struct UndeclaredStruct blah; Undeclared *p = &blah; which would naïvely translate to D as: struct UndeclaredStruct; extern UndeclaredStruct blah; auto p = &blah; which doesn't compile. Why not? Neither the size nor any default initialiser is needed.