Outputting the pre-processor result is not that helpful, you&#x27;re still stuck with deciphering things.<p>macro expansion is useless, again, for same reason you can&#x27;t marry it to actual code.  If you can do this now, would be at most curious (not interested) as it&#x27;s evil to begin with.<p>A production build in the embedded world, typically means you don&#x27;t have symbols.  Often they are stripped to save space and unless you have a USB stick or something you carry with you with map files, you&#x27;re still toast.<p>And there are a whole host of other reasons why they are just pure evil:<p>1.  Global scope only.
2.  Unexpected results rather than error messages - ISO25259 won&#x27;t even allow you to do this if that tells you anything.
3.  Can&#x27;t use sizeof
4.  no type checking.  Every compiler I&#x27;ve used, including GCC, won&#x27;t warn about if an int is compared to unsigned.
5.  can&#x27;t take the address
6.  worst, substituted value need not even be legal in the context the #define is created because it is evaluated at each point it is referenced allowing to another evil problem of being able to reference objects that are not declared yet.<p>I could go no... and I haven&#x27;t even touched on strings yet.<p>with so many problems, I have a hard time justifying or championing their use.