- Source file inclusion (as pioneered in BCPL). Common declarations could be separated out
into a header file, and made available to a range of source files. Though the ".h" convention
was adopted for the extension of header files, unhappily no convention arose for relating the
header file to the object library that contained the corresponding code. - Expansion of general code templates. Unlike a function, the same macro argument can take
different types on successive calls (macro actual arguments are just slotted unchanged into the
output). This feature was added later than the first two, and sits a little awkwardly on C.
White space makes a big difference to this kind of macro expansion.
#define a(y) a_expanded(y)
a(x);
expands into:
a_expanded(x);
However,
#define a (y) a_expanded (y)
a(x);
is transformed into:
(y) a_expanded (y)(x);
Not even close to being the same thing. The macro processor could conceivably use curly braces like
the rest of C to indicate tokens grouped in a block, but it does not.
There's no extensive discussion of the C preprocessor here; this reflects the view that the only
appropriate use of the preprocessor is for macros that don't require extensive discussion. C++ takes
this a step further, introducing several conventions designed to make the preprocessor completely
unnecessary.
Software Dogma
C Is Not Algol
Writing the UNIX Version 7 shell (command interpreter) at Bell Labs in the late 1970's,
Steve Bourne decided to use the C preprocessor to make C a little more like Algol-68.
Earlier at Cambridge University in England, Steve had written an Algol-68 compiler, and