(cpp.info.gz) Function-like Macros
Info Catalog
(cpp.info.gz) Object-like Macros
(cpp.info.gz) Macros
(cpp.info.gz) Macro Arguments
3.2 Function-like Macros
========================
You can also define macros whose use looks like a function call. These
are called "function-like macros". To define a function-like macro,
you use the same `#define' directive, but you put a pair of parentheses
immediately after the macro name. For example,
#define lang_init() c_init()
lang_init()
==> c_init()
A function-like macro is only expanded if its name appears with a
pair of parentheses after it. If you write just the name, it is left
alone. This can be useful when you have a function and a macro of the
same name, and you wish to use the function sometimes.
extern void foo(void);
#define foo() /* optimized inline version */
...
foo();
funcptr = foo;
Here the call to `foo()' will use the macro, but the function
pointer will get the address of the real function. If the macro were to
be expanded, it would cause a syntax error.
If you put spaces between the macro name and the parentheses in the
macro definition, that does not define a function-like macro, it defines
an object-like macro whose expansion happens to begin with a pair of
parentheses.
#define lang_init () c_init()
lang_init()
==> () c_init()()
The first two pairs of parentheses in this expansion come from the
macro. The third is the pair that was originally after the macro
invocation. Since `lang_init' is an object-like macro, it does not
consume those parentheses.
Info Catalog
(cpp.info.gz) Object-like Macros
(cpp.info.gz) Macros
(cpp.info.gz) Macro Arguments
automatically generated by
info2html