In my experience, not all macros have been evil. Along the course of my career, macros have been useful in a limited context. In MFC, message crackers provided a concise DSL-like description for message maps. Type-agnostic macros provided useful utility functions for a pre-template versions of C++, albeit dangerous.
However, I have seen many more cases where macros were used poorly. I recall one such occasion where I was helping a co-worker track down a GPF caused by an obscure function call. Offhand, I instructed them to simply examine the disassembly in the debugger to provide some more clues. To my surprise this revealed pages and pages of assembly code for this single function call. Further investigation reveled this “function” was simply a macro which called several other macros. As it turned out the source of the GPF was four macro levels deep, but was a huge headache to unravel.
It seems to me that macros are a thing of the past. Does anyone still use them for any new development? In light of the current language syntax for C++, are all macros now evil? Do other languages use macros and how do they deal with the pitfalls?