#if and the defined stuff are in even the older c standards, but it's not defined to be part of the compiler (in plan 9, it's still in a separate cpp, and usually that's not used, except with pcc, but see the -p option in 2c(1)) early on, cpp was fairly simple minded, part of the cc command(!), and a c file had to have # at the start to be macro-processed. the rot really set in with reiser This new version [of the preprocessor] was written by John F. Reiser and is from 5 to 12 times faster than the old. (but the input language was considerably more elaborate, and didn't people use it!)