I think the preprocessor is the biggest mistake. It was introduced to address issues of separate compilation in a simple way, but it generated more trouble than advantages.
The things that makes macros actually nice are some of the gcc extensions, like the ({ }) block expression syntax and typeof().