Falcata
Falcata

Reputation: 707

Preprocessing Macro

if in the beginning of my file i do

#define dbg_kprintf \
   if (x_var) kprintf

I late on do statements using

dbg_kprintf ("blablabla");

My question is that will dbg_kprintf be only defined if xvar is defined somewhere else? If it is not then will dbg_kprintf statements not be used at compile time?

Thanks.

Upvotes: 1

Views: 130

Answers (4)

zellio
zellio

Reputation: 32484

In C/C++ Macros can take arguments. It will be defined either way, as it's just a pre-processing directive but the compile will fail if it's not defined. To pass an argument to a macro use this syntax

#define foo(X)  ((X))

Upvotes: 1

Michael Dorgan
Michael Dorgan

Reputation: 12515

No, in that example, x_var has to exist somewhere or it will fail to compile. You are looking for something like


#if (x_var)
  #define dbg_kprintf kprintf
#else
  #define dbg_kprintf
#endif

Upvotes: 3

Daniel Daranas
Daniel Daranas

Reputation: 22624

dbg_kprintf will be used before complie time. The preprocessor will substitute in its place the contents you defined: if (x_var) kprintf. Then it will try to compile your code normally.

Upvotes: 0

unwind
unwind

Reputation: 399703

No, that will either compile into a run-time check of the variable, or nothing (if the variable is in fact compile-time constant with a false value and the optimizer feels like eliminating the dead code) or a call always (if it's a compile-time constant with a true value). So, now you know.

The typical way to ensure that debug code is excluded from non-debugging builds is to use a preprocessor symbol to guard the code. Note that it might require you to manage the arguments differently.

Upvotes: 4

Related Questions