Messages in this thread | | | Date | Tue, 1 Aug 2006 10:57:51 +0100 | From | Russell King <> | Subject | Re: do { } while (0) question |
| |
On Tue, Aug 01, 2006 at 11:45:53AM +0159, Jiri Slaby wrote: > Peter Zijlstra wrote: > >On Tue, 2006-08-01 at 02:03 -0700, Hua Zhong wrote: > >>>#if KILLER == 1 > >>>#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. > >>Really? Does it compile? > > > >No, and that is the whole point. > > > >The empty 'do {} while (0)' makes the missing semicolon a syntax error. > > 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).
Your sentence does not make sense, but I'm going to take it as saying that you disagree that the above will cause a syntax error. Try it:
$ cat t.c #if KILLER == 1 #define MACRO #else #define MACRO do { } while (0) #endif
void foo(int some_condition) { if (some_condition) MACRO
if_this_is_not_called_you_loose_your_data(); } $ gcc -O2 -o - -E t.c # 1 "t.c" # 1 "<built-in>" # 1 "<command line>" # 1 "t.c"
void foo(int some_condition) { if (some_condition) do { } while (0)
if_this_is_not_called_you_loose_your_data(); } $ gcc -O2 -o - -S t.c >/dev/null t.c: In function `foo': t.c:12: error: parse error before "if_this_is_not_called_you_loose_your_data" $ gcc -O2 -o - -E t.c -DKILLER # 1 "t.c" # 1 "<built-in>" # 1 "<command line>" # 1 "t.c"
void foo(int some_condition) { if (some_condition)
if_this_is_not_called_you_loose_your_data(); } $ gcc -O2 -o - -S t.c -DKILLER >/dev/null $
Hence, using do { } while (0) has had the desired effect - the missing semicolon causes a compile error, while the empty macro results in unintentional successful compilation without warning or error.
-- Russell King Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/ maintainer of: 2.6 Serial core - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |