C/C Preprocessor
From Devpit
Macros
- The following C macro example is what GCC calls a 'statement expression'. It returns the value of the last expression in a statement block.
#define FOO(x) ({ \
int foo = 1024; \
foo + x; \
})
- This expression will not expand out with the '{' '}' braces.
#define BAR(x) { \
bar = FOO(x); \
}
- For that you need:
#define BAT(x) do { \
bat = FOO(x); \
} while(0)
Function definitions
- If you want to redefine function foo(bar) to foo_internal(bar) the following won't work:
#define foo (bar) foo_internal (bar)
- You must use not have a space between foo and its parameter list:
#define foo(bar) foo_internal (bar)
- This applies for normal macro function expansions in general. When invoking:
BAT(z);
with the following macro definition:
#define BAT (x) do { \
bat = FOO(x); \
} while(0)
It will expand as:
(x) { bat = FOO(x); }
Which is WRONG. You need:
#define BAT(x) do { \
bat = FOO(x); \
} while(0)
So that it expands as:
{ bat = FOO(z); }