On Wed, 13 Oct 2010 21:25:15 -0700, Jonathan M Davis wrote: > Okay. in the code that I'm working on at the moment, I get an exception > saying that a cyclic dependency was detected but no information > whatsoever as to where it is or what it means. I haven't been able to > find much information on them other than some discussions of making it > so that the compiler detects them at compile time. I have yet to figure > out _what_ it is that is causes such errors. Could someone clue me in? > It's really hard to track down a bug when the error only tells you that > there's a bug and doesn't say anything about where it happens, and I > have no clue what sort of things can be cyclically dependent.
Say you have two modules, a and b. Both have static constructors, and a imports b: // a.d module a; import b; static this() { ... } // b.d module b; static this() { ... } The language is then defined so that b's constructor is run before a's, since a depends on b. But what happens if b imports a as well? There is no way to determine which constructor to run first, so the runtime throws a "cyclic dependency" exception. The way to fix it is to move one of the module constructors into a separate module: module a; import a_init; import b; module a_init; static this() { ... } module b; import a; static this() { ... } For a "real" example of how this is done, check out std.stdio and std.stdiobase in Phobos. -Lars