There are certain language feature that do get abused by some programmers who have not learned better. Over time, the trend of abuse leads to large consensus of "practice/feature X is bad" and then propagates into an almost a knee-jerk reaction of "OMG I see practice/feature X in this code, this code must be burned"
Global variables or singletons is another great example of this. There is ABSOLUTELY a need to have them and use them WHEN appropriate. The problem is that 98% of code you see out there, these practices should not be used.
As someone who is new to the language you need to learn what each feature does, but don't discount and forget about it just because you heard from somewhere that it is bad. Learn why it is bad and learn to code a better way so you do not need to use it. But after you get through all that, there will absolutely be times when preprocessor is the right answer for certain types of problems.
Biggest problem with preprocessor (besides not being typesafe and all that...) is that people put code in there. Then, maybe a bit more code, then maybe an if-statement. When you debug code with preprocessor, all you see is the point of execution on your macro with no useful idea of what's going on behind it.
As an extreme case, I once worked with a guy who had 200+ line macros. When he needed to debug them, he would copy-paste them directly into the code where the macro was used and remove all '\' from line ends. Then when he was done, he would put the macro back in place, copy-paste all that code back and manually put back all '\' on line ends. Now that is something YOU SHOULD NEVER EVER DO... NEVER :)