He missed one important thing - the C preprocessor is completely unaware of C types. Its expressions follow different rules.
A major goal of D was to make the language expressive enough to not leave room for the preprocessor:
1. modules
2. manifest constants
3. nested functions
4. lambdas
5. static if
6. compile time function execution
7. string mixins