On Sunday, 16 September 2012 at 14:28:40 UTC, Andrey wrote:
Well, sometimes it works and sometimes doesn't. For example, if I exclude std.stdio import from the module file, then it works just with "dmd tests.d". Although yersterday it worked fine even with imported stdio. It this undefined behavior? What it depends on?


It is defined, but the reason might not be easy to spot. The factor that matters is if any of the code in the file is actually used by the finished program. If you call one of the datastructures functions in tests.d, you will always have to include the module.

With imports, there can be seemingly hidden uses of the module code in cases like initialization or getting certain class info, etc.

When you import std.stdio, it tries to get the struct's typeinfo, which it uses to find the toString() method. Since this uses part of your module's code, it needs to find the module to link. Thus you get the error if it wasn't specified.

Now, sometimes, you can use part of a module, but not need the moduleinfo. This would be if you only used a template from it. The reason is the template code then ends up in your other module via the import, so the linker can find it that object file. In these (rare) cases, you won't get an error.

I feel like I'm rambling.. I hope it makes sense.

But, in general, just always list your modules on the command line. 99% of the time, you'll need it to successfully link. Some part of it is almost always used.

Reply via email to