Yes, that's exactly what I'm saying: the preprocessor is evil.
Every #define macro effectively creates a new keyword in every source file
and every scope until that symbol is #undefd. The preprocessor lets
you create a #define symbol that is always replaced independent of
the {...} scope where that symbol appears.
Sometimes we need the preprocessor, such
as the #ifndef/#define wrapper within each header file, but it should be
avoided when you can. "Evil" doesn't mean "never use."
You will use evil things sometimes, particularly when they are "the
lesser of two evils." But they're still evil :-)