I wouldn't even consider taking that challenge; multiline macros in cpp are a nasty kludge at best.
I wasn't talking about its effectiveness as a macro preprocessor, but as a tool that can be applied to a variety of situations aside from the one it was designed for. The main advantage of cpp is that it is simple and low-overhead; it works very nicely as a filter, and the syntax is simple enough that it can be used with many different languages and markups.
As a macro preprocessor, cpp is stone knives and bear skins, and was even in 1970; but for the sort of situation I'm talking about, that's more than enough.
OTOH, if it's powerful macros you want, some of the other macro preprocessors like
m4 make NASM's macros look skimpy. For that matter, MASM's macro facility is quite powerful, though hideously ugly.
Actually, the real heydey of macro preprocessors was in the early 1970s. For example, there was a notorious Macro Assembler implementation of SNOBOL4 - that is, the SNOBOL language was implemented
as a set of preprocessor macros, and SNOBOL programs would be just run through the macro assembler with the necessary macro libraries. The
Common LISP macro facility is a relic of that era, and even it isn't as powerful as many.