
On Fri, 27 Apr 2012 04:17:37 +0000, Stephan T. Lavavej wrote:
[Paul Mensonides]
The best case scenario, if you want to support legacy mode: compiler switch to *disable* a compliant preprocessor. I.e. do the right thing _by default_ (just like with for-loop scoping).
Yeah, you're right. I take back what I said about pragmas, I see that they would be especially unworkable for macros.
wanton macro abuse
I was inured to defending against macroized min/max, but we recently discovered that Yield was macroized too - fun.
Not just min/max. Many many Windows API names too (i.e. A vs. W). Obviously this is an issue for C without overloading, but there could be separate C++ headers that have overloaded inline thunks. Otherwise, all non-local (meaning locally defined, used, undefined) should be prefixed - and- all uppercase. Window headers aren't special (neither are other library headers... I'm looking at you Qt and Linux (e.g. "major")) and should obey the appropriate conventions. The Windows headers are simply garbage from the dark ages that is inflicted on way too many users. (The same actually goes for Qt's ridiculous signals/slots moc mechanism.) Library authors: get it out of your heads that your library is "special." In the particular cases of Windows and Qt, the use of either should be an insignificant part of any software. Otherwise, the software is fundamentally poorly designed. This is true even for preprocessor metaprogramming libraries. The contract library referenced in this thread, Boost.Python, the MPL, etc., all use Boost.Preprocessor, but the use is ultimately incidental--an implementation detail. By definition, a library simply cannot tell how pervasive or important it will be in a client or in a client's client (and so on). That is *one* of the things that makes library building hard--you often don't know whether optimization in any particular case is necessary. Regards, Paul Mensonides