July 26, 2004 imported version specifications fail in some cases | ||||
|---|---|---|---|---|
| ||||
I have a module foody:
--------
version = foody;
--------
Another module looks like this:
--------
import std.stdio;
import foody;
version (foody) {
int f() { return 77; }
}
version (bardy) {
int f() { return 3; }
}
void main() {
writefln(f());
}
--------
This won't compile, saying that f is and undefined identifier.
Doing it the way below works as expected:
--------
import std.stdio;
import foody;
void main() {
version (foody) {
int f() { return 77; }
}
version (bardy) {
int f() { return 3; }
}
writefln(f());
}
--------
Maybe you should specify the rules for version specification lookup? I would expect one of two;
1. version specifications are applied after they have been found (lexically? not to sure about the wording to use). That is;
-----------
version (foody) { int foo() {return 77;} }
version = foody; // or import with version = foody;
-----------
The version block is kept out of the compilation. Switching the lines works. (This is the way it works with the version specification statement. Due to the behaviour outlined above, I can't test it with imports.)
2. all version specifications are looked up before checking if a block should be compiled in or not. I suspect that this solution can lead to a recursive nightmare, as version blocks can hold further specifications and imports.
Personally, I think 1 is the correct answer (and that 1 *should* be the correct answer) but that the implementation is somewhat lacking.
Lars Ivar Igesund
| ||||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply