There is also no point in including it three times, since you can happily use a slow version of cpp with one function for each string witdth. Per Hedbor worked on that a week ago, with very good results in triming down the size (just getting rid of all the inlined code does wonders in both size and speed). The code is however very britle, and in the end he ended up with strange bugs so he decided to start over at some later point, and do it in small incremental changes.
The same is true of the lexer, by the way, there does not really _need_ to be three versions, simply use normal string indexing code. It's not _that_ slow, and generally speaking you do not spend most of your time compiling, optimizing that case specifically to this extent seems rather excessive.
Even without inlining the amount of code duplication in preprocessor.h is rather amazing, by the way. Just look for all the code skipping quoted newlines.
This could be moved to a pre-pass, making all other parsing both easier to read and smaller, code-wise.
But it takes time.