digitalmars.D.learn - Are static variables available to other static variables?
- Jamie (12/12) Apr 12 2019 I was trying to declare a static variable dependent on another
- Dennis (4/7) Apr 12 2019 Add `const` or `immutable` to A and it will work.
- Jamie (15/27) Apr 12 2019 Ok I'm confused... why does that above not work but this does:
- Simen =?UTF-8?B?S2rDpnLDpXM=?= (6/35) Apr 12 2019 A static constructor isn't run at compile time, but upon starting
- XavierAP (8/37) Apr 12 2019 May this be a bug? Static mutable is a theoretically valid use
- XavierAP (8/37) Apr 12 2019 It's not a bug. I finally found it in the spec:
I was trying to declare a static variable dependent on another static variable, but it didn't work. Are static variables not known to other static variables at compile time? void main() { C c = new C(); } class C { static size_t A = 2; static size_t B = 2^^A; // A is not known at compile time }
Apr 12 2019
On Friday, 12 April 2019 at 10:49:19 UTC, Jamie wrote:I was trying to declare a static variable dependent on another static variable, but it didn't work. Are static variables not known to other static variables at compile time?Add `const` or `immutable` to A and it will work. I don't know why B can't be initialized with A's initial value if A is mutable, but there's probably a rationale for that.
Apr 12 2019
On Friday, 12 April 2019 at 10:49:19 UTC, Jamie wrote:I was trying to declare a static variable dependent on another static variable, but it didn't work. Are static variables not known to other static variables at compile time? void main() { C c = new C(); } class C { static size_t A = 2; static size_t B = 2^^A; // A is not known at compile time }Ok I'm confused... why does that above not work but this does: void main() { C c = new C(); } class C { static size_t A = 2; static size_t B; static this() { B = 2^^A; } }
Apr 12 2019
On Friday, 12 April 2019 at 10:56:32 UTC, Jamie wrote:On Friday, 12 April 2019 at 10:49:19 UTC, Jamie wrote:A static constructor isn't run at compile time, but upon starting the program. Thus, values that are only available at run time can be used by a static constructor. -- SimenI was trying to declare a static variable dependent on another static variable, but it didn't work. Are static variables not known to other static variables at compile time? void main() { C c = new C(); } class C { static size_t A = 2; static size_t B = 2^^A; // A is not known at compile time }Ok I'm confused... why does that above not work but this does: void main() { C c = new C(); } class C { static size_t A = 2; static size_t B; static this() { B = 2^^A; } }
Apr 12 2019
On Friday, 12 April 2019 at 10:56:32 UTC, Jamie wrote:On Friday, 12 April 2019 at 10:49:19 UTC, Jamie wrote:May this be a bug? Static mutable is a theoretically valid use case. It looks to me that D often optimizes by evaluating at compile time. But in this case what is a possible optimization breaks a valid program when the optimization is found not to be possible. initializations at run-time during the first use of C.I was trying to declare a static variable dependent on another static variable, but it didn't work. Are static variables not known to other static variables at compile time? void main() { C c = new C(); } class C { static size_t A = 2; static size_t B = 2^^A; // A is not known at compile time }Ok I'm confused... why does that above not work but this does: void main() { C c = new C(); } class C { static size_t A = 2; static size_t B; static this() { B = 2^^A; } }
Apr 12 2019
On Friday, 12 April 2019 at 10:56:32 UTC, Jamie wrote:On Friday, 12 April 2019 at 10:49:19 UTC, Jamie wrote:It's not a bug. I finally found it in the spec: https://dlang.org/spec/class.html#static-constructor "All member initializations must be determinable by the compiler at compile time, hence there is no order-of-evaluation dependency for member initializations, and it is not possible to read a value that has not been initialized. Dynamic initialization is performed by a static constructor"I was trying to declare a static variable dependent on another static variable, but it didn't work. Are static variables not known to other static variables at compile time? void main() { C c = new C(); } class C { static size_t A = 2; static size_t B = 2^^A; // A is not known at compile time }Ok I'm confused... why does that above not work but this does: void main() { C c = new C(); } class C { static size_t A = 2; static size_t B; static this() { B = 2^^A; } }
Apr 12 2019