Date: Fri, 13 Mar 1998 17:49:42 +0100 From: lennartz.electronic@t-online.de (Thomas Zenker) To: freebsd-current@FreeBSD.ORG Subject: Re: A question about sys/sys/queue.h Message-ID: <19980313174942.53822@tue.le> In-Reply-To: <19980313121330.54903@follo.net>; from Eivind Eklund on Fri, Mar 13, 1998 at 12:13:30PM %2B0100 References: <XFMail.980312191745.shimon@simon-shapiro.org> <19980313121330.54903@follo.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Mar 13, 1998 at 12:13:30PM +0100, Eivind Eklund wrote: > On Thu, Mar 12, 1998 at 07:17:45PM -0800, Simon Shapiro wrote: > > Why was the definition of some macros changed > > from: > > > > #define FOO(a) { ... } > > > > to: > > > > #define FOO(a) do { ... } while(0) > > > > I thought these are the same... > > Imagine these used in a dual if () statement: > > if (bar) > if (baz) > FOO(1); > else > printf ("You loose!\n"); > > With the former, you get something that (with proper indentation) map > as > > if (bar) > if (baz) > { ... }; > else > printf ("You loose!\n"); > > while with the do {...} while (0) trick, you get > > if (bar) > if (baz) > do { ... } while(0); > else > printf ("You loose!\n"); > It will not compile anyway. The version w/ "{ ... };" is syntactically incorrect, because there are two statements after the if, leaving the else w/o partner. if (bar) if (baz) { ... } /* compound_statement */ ; /* empty but existing statment! */ else /* else without matching if! */ ... while the second version "do { ... } while (0);" still is a simple statement. -- Thomas Zenker at work thz@lennartz-electronic.de private thz@tuebingen.netsurf.de To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19980313174942.53822>