I'm trying to do a debug system but it seems not to work.
What I wanted to accomplish is something like this:
#ifndef DEBUG
#define printd //
#else
#define printd printf
#endif
Is there a way to do that? I have lots of debug messages and I won't like to do:
if (DEBUG)
printf(...)
code
if (DEBUG)
printf(...)
...
A common trick is to do this:
This way you have the whole power of
printf()
available to you, but you have to put up with the double brackets to make the macro work.The point of the double brackets is this: you need one set to indicate that it's a macro call, but you can't have an indeterminate number of arguments in a macro in C89. However, by putting the arguments in their own set of brackets they get interpreted as a single argument. When the macro is expanded when
DEBUG
is defined, the replacement text is the wordprintf
followed by the singl argument, which is actually several items in brackets. The brackets then get interpreted as the brackets needed in theprintf
function call, so it all works out.In C++17 I like to use constexpr for something like this
Then you can do
The caveats are that, unlike a preprocessor macro, you are limited in scope. You can neither declare variables in one debug conditional that are accessible from another, nor can they be used at outside function scopes.
It's been done. I don't recommend it. No time to test but the mechanism is kind of like this:
This works if your compiler processes // comments in the compiler itself (there's no guarantee like the ANSI guarantee that there are two passes for /* comments).
I use this construct a lot:
This way I can tell in my console which program is giving which error message... also, I can search easily for my error messages...
Personally, I don't like #defining just part of an expression...
You can take advantage of
if
. For example,Compiler will remove these unreachable code if you set a optimization flag like
-O2
. This method also useful forstd::cout
.С99 way:
Well, this one doesn't require C99 but assumes compiler has optimization turned on for release version: