On Tuesday, 6 February 2018 at 23:21:36 UTC, Jonathan M Davis wrote:
On Tuesday, February 06, 2018 23:03:07 dekevin via Digitalmars-d-learn wrote:
Hello everyone,
I just ran into the problem, that I need a static variable, where
the initialisation code for that variable is only accessible
during run-time (since part of the initialisation code will be
dynamically linked).

Is there a way to do this in D?

To be a bit more concrete, this is where I have the problem (where ℚ uses GMP, which is dynamically linked):

struct ℚInf {
    ℚ qval;
    immutable static ℚInf zero = ℚInf(0,1);
    this(long num, long den) {
         qval = ℚ(num,den); //this initialisation requires
dynamically linked code
     }
}

So, you want qval to be static and initialized at runtime? Then use a static constructor. e.g.

struct QInf
{
    ...
    static this()
    {
        qval = ...;
    }
    ...
}

That doesn't work if you're dealing with a static local variable, but it works for static members of structs and classes, and it works for module-level variables.

And if you want to make qval immutable, then use a shared static constructor. e.g.

struct QInf
{
    ...
    shared static this()
    {
        qval = ...;
    }
    ...
}

You can currently initialize immutable static variables with non-shared static constructors, but that's a bug and will result in the immutable variable being reinitialized whenever a new thread is created.

- Jonathan M Davis

Thanks a lot! I will change all my initialisations to static constructors now. The only additional problem I have, is that ℚInf has a disabled default constructor. Is there a way to allow shared static constructors, but not the default constructor?
struct ℚInf {
     ℚ qval;
     immutable static ℚInf zero;
    @disable this();
     shared static this() {
          zero.qval = ℚ(0);
     }
     this(long num, long den) {
          qval = ℚ(num,den); //this initialisation requires
 dynamically linked code
      }
}

Best,
Kevin

Reply via email to