Nice article Eduard.

Re: last comment. Not sure how having to change the implementation of a Macro is any less of a pain than having to change hundreds of class method arguments. If anything Macro's are a great way to abstract application wide changes with a single line of code. Granted recompilation is required, but code that can't withstand recompilation all day long has a deeper problem.

My only negative about Macro's is when you can't read the code for Macro soup, less is more for me. 

One tip to add. I like to have auto complete work for Macros. If you precede each macro with a triple comment, then they will appear in the auto complete suggestions...

///
#define LogNone(%message)         $$$LogEvent("NONE", %message)
///
#define LogError(%message)        $$$LogEvent("ERROR", %message)
///
#define LogFatal(%message)        $$$LogEvent("FATAL", %message)