Thread overview |
---|
April 12, 2019 Are static variables available to other static variables? | ||||
---|---|---|---|---|
| ||||
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 } |
April 12, 2019 Re: Are static variables available to other static variables? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jamie | 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.
|
April 12, 2019 Re: Are static variables available to other static variables? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jamie | 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;
}
}
|
April 12, 2019 Re: Are static variables available to other static variables? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jamie | On Friday, 12 April 2019 at 10:56:32 UTC, Jamie wrote:
> 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;
> }
> }
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.
--
Simen
|
April 12, 2019 Re: Are static variables available to other static variables? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jamie | On Friday, 12 April 2019 at 10:56:32 UTC, Jamie wrote:
> 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;
> }
> }
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. Other languages e.g. C# would by spec run these static initializations at run-time during the first use of C.
|
April 12, 2019 Re: Are static variables available to other static variables? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jamie | On Friday, 12 April 2019 at 10:56:32 UTC, Jamie wrote: > 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; > } > } 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" |
Copyright © 1999-2021 by the D Language Foundation