His usage is clear enough but it is problematic.
There are two different languages involved, the C preprocessor
and the C language proper, that are effectively merged. The
preprocessor is a text transformation language. In that context
INC is a function that accepts an argument and returns a value.
The problem is that the C standard (and ordinary usage) talks
about the two languages together, i.e., C source code is usually
a mixture of text form the the two languages. Ergo it is
desirable to use different wording when talking about processor
functions and C functions. After all the two are very different
kinds of animals.
Part of education is getting rid of the habit of reification, and the
understanding that CONCEPTS are not THINGS (especially not animals:
this is a regression to childhood). People are diverted into crappy
but apparently well paid jobs as "computer programmers" and wind up
using childish metaphors unaware that they are metaphors, but some of
us who were so diverted know this.
C is the union of the "main" language and an excrescence called the
preprocessor. While doing their thing, both functions and macros in
some unified sense return values, but we are aware that this is done
differently.
If a C #define macro contains a #defined symbol, the inner symbol has
in fact to be translated before the outer symbol. Therefore the
preprocessor uses a stack and is in fact the "runtime" of a "macro
machine". #define symbols are brain-damaged programs for this machine
and may be usefully spoken in the active voice.
There's no reason why the C preprocessor could not be Turing complete,
with a #dowhile added. In the spirit of "vanity C", in which the C
compiler writer vain-gloriously ships extra features which he snarkily
enables or disables using a handy-dandy little switch (like,
apparently, void pointer fun in GCC) this would be nifty, if only
because it would confuse and then enrage Heathfield.