On Tue, 2006-08-01 at 11:45 +0159, Jiri Slaby wrote:Peter Zijlstra wrote:On Tue, 2006-08-01 at 02:03 -0700, Hua Zhong wrote:Bulls^WNope, it was a bad example (we don't want to break the compilation, just not want to emit a warn or an err).No, and that is the whole point.#if KILLER == 1Really? Does it compile?
#define MACRO
#else
#define MACRO do { } while (0)
#endif
{
if (some_condition)
MACRO
if_this_is_not_called_you_loose_your_data();
}
How do you want to define KILLER, 0 or 1? I personally choose 0.
The empty 'do {} while (0)' makes the missing semicolon a syntax error.
It was a perfectly good example why 'do {} while (0)' is useful. The
perhaps mistakenly forgotten ';' after MACRO will not stop your example
from compiling if KILLER == 1. Even worse, it will compile and do
something totally unexpected.
If however you use KILLER != 1, the while(0) will require a ';' and this
example will fail to compile.
Not compiling when you made a coding error (forgetting ';' is one of the
most common) is a great help.