Stop using #ifdef for configuration
Using #ifdef
’s to configure different conditional compilations is very error prone.
I believe we’ve all had the case where something was compiled, while it shouldn’t have been, due to accidentally creating/including a #define
of the same name or defining it to 0 while checking with #ifdef
.
While I won’t give you a solution to fix the flawed model of using the preprocessor for conditional inclusion, I’ll give you a solution to make it less error prone:
#if USING(DEBUG)
/* Do something in debug. */
#else
/* Do something in production. */
#endif
The USING
macro requires each configuration macro to be explicitly defined to special ON
or OFF
values, or you’ll get an error1.
By simply defining USING
to a mathematical expression and ON
/ OFF
to be the operators, we’ll get an error whenever an undefined or otherwise defined macro is tried to be used as an argument:
#define USING(x) ((1 x 1) == 2)
#define ON +
#define OFF -
Comments, criticism? Drop me a tweet @ArvidGerstmann.
Not entirely correct, but good enough for our case.