ebh@hou4b.UUCP (09/12/84)
[send me mail if you don't see this line]
from Waiming Mok:
#define spaces(n) do {int i=(n);while (i--) putchar(' ');}while (0)
You don't need the do .. while construct, just make a compound
statement:
#define spaces(n) {int i=(n);while(i--) putchar(' ');}
Remember, anywhere <statement> can go, {<decl-list>; <statement> ...}
can go. One problem can crop up: what if i is used elsewhere in the
code? Imagine what spaces(i) would do. Therefore, it's wise to use
some name that you never use in regular coding, like _. Also, make _ a
register variable to avoid the overhead of allocating more stack space,
and for the obvious speed and space advantages. Thus the final version
looks like this:
#define spaces(n) {int _=(n);while(_--) putchar(' ');}
And yes, things like spaces(foo*2) do work.
-Ed Horch {houxm,ihnp4,akgua}!hou4b!ebh
p.s. On systems that support it,
#define spaces(n) printf("%*s", (n), "");
works just as well.