debug()

Orion- thierry.passeron at gmail.com
Wed Feb 27 11:55:54 PST 2008


Bill Baxter Wrote:

> Orion- wrote:
> > Hello people,
> > 
> > I'm just starting D programming. I'd like to make a printf like function to print some debuging informations. The synopsis could be dprintf(char[] format, ...) and as an example:
> > dprintf("creating object at %a", self);
> > It would print something like:
> > debug: class1.d(13): creating object at 0XFFB8
> > where class1.d is the __FILE__ name and 13 is the __LINE__ where it was called.
> > 
> > So, here are my 2 questions:
> > 
> >   * How do you know 'self' inside a class member function in D?
> >   * How would you do to have __LINE__ being the line where dprintf was called not the line where it is implemented ?
> > 
> > Here is my dprintf function so far:
> > void dprintf(...) {
> >         TypeInfo[] infos;
> >         void *data;
> > 
> >         void putc(dchar c) { fputc(c, stderr); }
> > 
> >         Box[] box1 = boxArray("debug: ");
> >         Box[] box2 = boxArray(_arguments, cast(void *)_argptr);
> >         boxArrayToArguments(box1 ~ box2, infos, data);
> >         std.format.doFormat(&putc, infos, cast(char *)data);
> > }
> 
> There is a way to get the __LINE__ thing to work automatically, without 
> typing __LINE__, but the cure is almost worse than the disease.  For 
> simplicity I'll just use a non-formatted string to demonstrate.
> 
> string dprintf(string msg) {
>     return `writefln("%s(%s): ", __FILE__,__LINE__, msg);`;
> }
> ...
> mixin( dprintf("Hey you!"));
> 
> 
> At least I think that works.  I don't use it because I'm not about to go 
> around typing mixin everywhere to do debug output.  That's the kind of 
> thing that should some day be doable with macros, though.  Then you'll 
> be able to call it without the "mixin" part.
> 
> What I actually use is more like what Jason said.  debug(ver) {}.  I 
> don't bother with __FILE__ and __LINE__ stuff.
> 
> -----
> module MyModule;
> import std.stdio;
> private{
> debug(MyModule)
> {
>      alias writefln debugfln;
>      alias writef   debugf;
> }
> else {
>      void debugfln(...) {}
>      void debugf(...) {}
> }
> }
> 
> And I hope that the compiler is smart enough to inline an empty 
> function.  If it's not, I'm getting on the next plane to Seattle to 
> whack Walter 50 times with a wet noodle.
> 
> --bb

Thanks Bill, do you know of any document explaining the debug() D function ?

Regards, Thierry



More information about the Digitalmars-d mailing list