Quote Originally Posted by awsdert
Which is precisely why I'm doing as much as I can in the preprocessor to create fallbacks for macros, things that can be optimised out, better to assume a scenario exists where they don't exist then to assume not so.
As christop pointed out, the code tends to be cleaner when using ordinary C syntax than when using the preprocessor syntax. You're doing premature optimisation such that it is almost certainly not optimisation at all. Instead of assuming, follow good practices and test for when they don't apply.

Quote Originally Posted by awsdert
I'm not denying the abilities of modern compilers
"Modern" does depend on context (my undergrad class on "modern Japanese history" started with the mid-1500s), and in this case we're looking at a particular kind of dead code elimination that likely has been common for a quarter of a century or more. (I cannot cite a source, but it's an educated guess from a book written circa 1995 that explained why for ( ;; ) was considered canonical instead of while (1), but which also explained that the underlying issue, i.e., compilers generating code that evaluated the constant rather than generating the deliberate infinite loop, were old and no longer in use... in 1995.)