Subject: Re: Should PR 18434 be closed?
To: None <tech-kern@netbsd.org>
From: der Mouse <mouse@Rodents.Montreal.QC.CA>
List: tech-kern
Date: 04/07/2003 06:30:32
> The reason why wi.c couldn't compile is that DELAY() macro on hpcmips
> was defined as a block like below and wi.c used DELAY() as a
> expression.
> from sys/arch/hpcmips/include/param.h
> #define DELAY(n) { register int N = cpuspeed * (n); while (--N > 0); }
> It is easy to modify DELAY() to:
> #define DELAY(n) do { \
> register int N = cpuspeed * (n); while (--N > 0); \
> } while (/*CONSTCONT*/ 0)
That won't help; the result is still a statement, not an expression,
and thus can't be used in the repeat-clause of a for() loop. (Well,
technically, it's only most of a statement. But it's still not an
expression.)
Wrapping a do-while around it as you did does help one problem, but
this isn't it. (The problem it fixes is the "dangling else" problem:
if you write
if (...) DELAY(10); else { ... }
then the orginal DELAY() will produce a syntax error because the ; ends
up being not the terminator that turns an expression into a statement,
but rather an empty statement which forces the if() statement to end
before the else-clause gets attached to it. The do-while wrapper fixes
this by consuming the trailing semicolon.)
If you're willing to depend on gcc, you could write it as
#define DELAY(n) ({ register int N = cpuspeed * (n); while (--N > 0); })
but that's not C.
/~\ The ASCII der Mouse
\ / Ribbon Campaign
X Against HTML mouse@rodents.montreal.qc.ca
/ \ Email! 7D C8 61 52 5D E7 2D 39 4E F1 31 3E E8 B3 27 4B