AWOL:
It's an interesting example, Nick, but I honestly can't remember that last time I divided a pin number by...anything, really XD
and being designed before prototypes
I'm pretty sure I had to write prototypes for C.
Before the ANSI standard (i.e. the original K&R C, and before that the compilers used by Version 6/7 of UNIX from Bell Labs, and the Berkley distributions) there were no prototypes. The X3J11 committee started in 1983 or so, and was made a US ANSI standard in 1989, and a worldwide standard in 1990. Prototypes, const, and volatile were explicitly taken from C++, and put into C, though as I mentioned some changes were made (const is a lot weaker in C than C++, and we had to add an explicit void in prototypes to distinguish functions where there is no prototype from functions with a prototype that has no arguments).
The C compiler that I wrote the front end for (from scratch in PL/1) for the Data General MV/Eclipse (1981-ish) had no prototypes. Towards the end of my employment at Data General (1989), I was working on the Gnu compiler for the 88000 processor, which already had prototypes added to it.
In C89/90, prototypes are optional, and if there is no prototype, the compiler would essentially create a prototype for you, and the short types (char, short, float) would get promoted to their standard form (int, int, and double). Internally, within the committee, we called this the Miranda rule, after a famous ruling by the US supreme court. Our version of the Miranda rule went like: You have the right to a prototype, if you do not have a prototype, one will be appointed to you by the compiler. We did put in a proviso that declaring functions without a prototype might be removed in a future standard.
Note, C++ requires prototypes, but the IDE 'helps' users by adding prototypes for all user functions. Evidently from another posting, it gets enums wrong, in that it creates a prototype before the enum definition, and the compiler rightfully complains.