Proper C preprocessor macro no-op
===

For debug logging, I have often seen and used something like

        #ifdef DEBUG
            #define DLOG(fmt, args...) printf("%s:%d "fmt,__FILE__,__LINE__,args)
        #else
            #define DLOG(fmt, args...)
        #endif

but in a number of places, I have seen the second `#define` replaced with

            #define DLOG(fmt, args...) do {} while (0)

In particular, there's [this answer][1], and the comment on [this other answer][2] to the same question suggests that the problem would be in a situation like

        if (condition)
            DLOG("foo");

though my quick test suggests that the resulting semicolon on the line by itself will serve as the no-op statement inside the conditional.

Is one or the other of *nothing* and `do {} while (0)` better?  If so, why?  Is there something else that's even better?

  [1]: http://stackoverflow.com/a/1306690/291280
  [2]: http://stackoverflow.com/a/1306683/291280