I think about conditionals and compilers. I am programming an application for Arduino and so I need the application to be as fast as possible.
In my code I have this:
#define DEBUG false
pinName = "Pin ";
pinName += pin;
pinName += " initialized";
Any half-decent optimizing compiler will remove the whole code inside the if statement, if it can tell at compile-time that the condition always evaluates to false. Similarly, any half-decent compiler would skip the check itself if the condition is always true.
Indeed this is completely equivalent to "compiler switches" such as:
#define DEBUG #ifdef DEBUG ... #endif
The "compiler switch" syntax with
#ifdef is to prefer, as it makes the intent clearer to other C programmers. But that's just a matter of coding style - it will result in the same binary as your original code.