local class instance (at module-level)

Jacob Carlborg doob at me.com
Thu Mar 14 19:43:15 UTC 2019


On 2019-03-14 12:05, spir wrote:
> I desperately try to declare/define/initialise a simple class instance 
> at module-level. This is a special (conceptually static and immutable) 
> instance used as a "marker", that just should exist and be accessible by 
> methods of this class and/or other classes defined in the same module. 
> (Thus I don't care if TLS.) I use it as a remplacement for null, to 
> avoid semantic confusion and unhelpful segfaults in case of bug.
> 
> I have tried a number of options and never manage to do it, including:
> * [C/auto/static immutable c0] = new C(0) ;
> * C c0 ; c0.i = 0 ;
> * defining a static this()
> * more...
> 
> The most confusing error is:
> Error: variable `_base.c0` is a thread-local class and cannot have a 
> static initializer. Use `static this()` to initialize instead.
> 
> I also could not find any information --for a while, repeatedly, since I 
> can go on developing in the meantime, using null instead. I'm bluffed 
> and confused, since there is nothing weird in that, is there? (the 
> compiler can just allocate it in static mem and take the address)
> 
> Reduced test case:
> ===========================
> class C {
>      uint i ;
>      this (uint i) {
>          this.i = i ;
>      }
> }
> 
> // error
> auto c0 = new C(0) ;
> 
> void main () {
>      // ok
>      auto c0 = new C(0) ;
> }
> ===========================
> 
> I would enjoy an explanation (or a pointer to) in addition to a solution.
> 

It works if it's not a TLS variable:

class C {
     uint i ;
     this (uint i) {
         this.i = i ;
     }

     this (uint i) shared {
         this.i = i ;
     }

     this (uint i) immutable {
         this.i = i ;
     }
}

__gshared c0 = new C(0);
shared c1 = new shared C(1);
immutable c2 = new immutable C(2);

You only need one of the constructors depending on if you want a 
__gshared, shared or immutable variable.

> PS: I take the opportnity to ask if I can count on the compiler to 
> intern literal strings (which my code may use in several places, 
> including loops), esp. "", or should I declare and use (for instance):
> static immutable s0 = "" ;

String literals are stored in the executable. Each unique string literal 
is only stored once.

-- 
/Jacob Carlborg


More information about the Digitalmars-d-learn mailing list