eric@snark.UUCP (Eric S. Raymond) (12/22/88)
The two most important thing to remember about style standards are: 1. Their payoff is in inverse proportion to the shop's average skill level, and 2. Style standards imposed from above don't work and breed resentment. I wrote most of a book on portable C coding once. We deliberately avoided issuing any fiats about indentation beyond "be consistent!", knowing they would be a pointless and losing proposition. That having been said, I will now shamelessly plug for *my* one personal style crotchet ;-). Religious flames will be ignored but I am genuinely interested in what y'all think of my aesthetic arguments. In general, I code in what I think of as "BSD/Allman" style with 4-space indent: int samplefunc(arg1, arg2) char *arg1; /* args start after a tab column */ int arg1; { int foo; /* a blank line separates auto declares from code */ if (ifcond) /* extra spaces around conditionals annoy me */ { for (i = startval; i < endval; i++) /* note space after ; */ { switch (val) /* indent cases at same level as switch */ { case VAL1: c = b + a; /* note spaces around = and + */ break; case VAL2: function(arg1, arg2); /* no space before ( */ break; default: break; } } } } Simple, clean, and editor-friendly. The fact that I was a LISP and Pascal hack before I learned C is not irrelevant :-). Here's my one crotchet: I like to write do { /* interior-stuff */ } while (condition); Why? Well, first of all, I strongly dislike do-layouts that crowd the condition up against code in the do-scope, like: do { /* if there's lots of busy stuff */ /* happening inside the do block */ } while (the condition is hard to read) Compare this with do { /* if there's lots of busy stuff */ /* happening inside the do block */ } while (isn't this easier?) /* visually distinguish the condition part */ So the condition should be separated by one line from the block. The reasonable choices for end-of-do-block layout are then /* #1 */ } while (cond) or /* #2 */ } while (cond); or /* stuff */ } while (cond); #3 strikes me as too much of a good thing. It would imply a start-of-block layout like: do { /* A */ which means I clobber 6 lines of vertical space in overhead for this one construct -- no thanks, I've only got a 23-line screen! #1 has the problem that the (cond) part doesn't fall on a 'natural' indent level; everything else is at 4n stops, but it's at 4n + 7. Ugly. So I go with #2, and I think that pretty much demands a 'do {' by symmetry. -- Eric S. Raymond (the mad mastermind of TMN-Netnews) Email: eric@snark.uu.net CompuServe: [72037,2306] Post: 22 S. Warren Avenue, Malvern, PA 19355 Phone: (215)-296-5718