How do you put log calls in constructors when they may be created in a static context?

Jonathan M Davis newsgroup.d at jmdavisprog.com
Thu Aug 9 20:02:41 UTC 2018


On Thursday, August 9, 2018 7:15:58 AM MDT aliak via Digitalmars-d-learn 
wrote:
> On Thursday, 9 August 2018 at 12:01:42 UTC, Jonathan M Davis
>
> wrote:
> > On Thursday, August 9, 2018 2:37:49 AM MDT aliak via
> >
> > Digitalmars-d-learn wrote:
> >> On Wednesday, 8 August 2018 at 23:47:22 UTC, Jonathan M Davis
> >>
> >> wrote:
> >> > On Wednesday, August 8, 2018 3:54:34 PM MDT aliak via
> >> >
> >> > Digitalmars-d-learn wrote:
> >> >> I'm trying to debug stuff, so I want to add verbose logging
> >> >>
> >> >> struct S(T) {
> >> >>
> >> >>    this() {
> >> >>
> >> >>      writeln("created S(T) with properties and ID");
> >> >>
> >> >>    }
> >> >>
> >> >> }
> >> >>
> >> >> static a = S!int(); // bah
> >> >>
> >> >> I guess users can call this code from any context, but when
> >> >> i'd also like to see the log output for debugging purposes.
> >> >> Is there a way around this?
> >> >>
> >> >> Can I maybe only do a writeln in a non compile-time context?
> >> >
> >> > if(__ctfe)
> >> > {
> >> >
> >> >     // code here will execute if this is encountered during
> >> >
> >> > CTFE
> >> >
> >> > }
> >> > else
> >> > {
> >> >
> >> >     // code here will execute if this is encountered outside
> >> >
> >> > of
> >> >
> >> > CTFE
> >> > }
> >> >
> >> > - Jonathan M Davis
> >>
> >> That won't work because __ctfe is not readable at compile
> >> time. And I don't want that writeln there when there's compile
> >> time evaluation because errors.
> >
> > Huh? __ctfe's entire purpose is so that you can differentiate
> > between code that's run at compile-time and code that's run at
> > runtime. If a piece of code is executed at compile-time, __ctfe
> > is true, whereas if it's executed at runtime, __ctfe is false.
> > So, if you have
> >
> > this(T i)
> > {
> >
> >     if(!__ctfe)
> >
> >         writeln("log it");
> >
> > }
> >
> > then the code will print "log it" if the object is constructed
> > at runtime, whereas it won't print anything if it's run at
> > compile time, and there won't be any errors for trying to call
> > writeln at compile time, because it will have been skipped.
> >
> > - Jonathan M Davis
>
> Maybe I'm just explaining what I'm trying to do wrong, but that
> code doesn't compile when "this" is called in a valid compile
> time evaluation context, you'll get errors:
> https://run.dlang.io/is/KiJrR1
>
> That link contains the gist of what I want to do. If you could
> static if (__ctfe) ...  then that'd work but I don't know if
> there's something like that. Alternatively, if I can get a non
> compile time evaluated static then that also will do the trick.

It's failing, because you got the condition backwards. __ctfe is true during
CTFE and false during runtime. Your code has

if(__ctfe)
    writeln("log it");

which means that it will attempt to run writeln at compile time, whereas if
you used

if(!__ctfe)
    writeln("log it");

it would skip it at compile time. The problem isn't that writeln is being
compiled in. The problem is that it's being encountered when CTFE is running
the code. So, a static if is unnecessary. You just need to get the condition
right.

- Jonathan M Davis





More information about the Digitalmars-d-learn mailing list