On Sun, Feb 27, 2022 at 10:12:39AM +1100, Rob Pike wrote:
Cpp was definitely in v6, and I'm pretty sure it
was in earlier editions.
The first pass of the C compiler would invoke it if the first byte of the
source file was a '#'. However, the early version only did #define and
#include. It was rewritten for v7, I believe, introducing the catastrophe
of #ifdef, while the existential horror of #if was later still, foisted on
us by someone not in Research.
-rob
As someone who has lived through a lot of #if / #ifdef et al, I've got
mixed feelings. SGI definitely abused it, Dave Cutler was asked to
make NT work on MIPS and was given the IRIX kernel source as a guide.
That source was riddled with #ifdef <something>WAR where "WAR" stood for
"work around" (I might have the details wrong but definitely have the
idea correct). All of those work arounds were kernel code that had to
be different because various MIPS chips had bugs.
Cutler's response was "Send me the kernel code when you have MIPS chips
that actually work". He was disgusted and I don't blame him.
On the other hand, I grew up in the era that X11 was sort of new, all the
vendors had their own windowing system (Sunview comes to mind), and while
they all had something to be said for them (the Sunview API was really
nice), they all were different. So people like me carried around an X11
source tree and built it on whatever platform I happened to be running
on today (I was a contractor early on, worked on lots of different boxes).
The X11 tree was a heavily ifdef-ed. And it needed to be, I don't have
an answer as to how you would reuse all that code on different hardware
in a better way. Yep, ugly, but having N copies of the same code,
all almost the same but a little different, yeah, that's a formula for
having bugs fixed in one of those copies but not the others.
So while I understand (I think) Rob's distaste for #ifdef, I've been
very grateful for it when I needed it. I ran ctwm on X11 for decades
and everything "just worked" on Suns, SGIs, PowerPC, PARISC, etc.
--lm