bookishq
bookishq

Reputation: 193

Invoke function instead of macro in C

My question is: If you have a macro and a function with the same name, only the macro would be invoked, right? What if I want to invoke the function instead of the macro?

Upvotes: 6

Views: 285

Answers (3)

jamesdlin
jamesdlin

Reputation: 90175

If you have a function and a function-like macro both named foo and want to invoke the function version, you can do:

(foo)(args)

This works because function-like macro names must be followed by a parenthesized argument list for substitution to occur.

This is mentioned in section 7.1.4/1 of the ISO C99 standard:

Any function declared in a header may be additionally implemented as a function-like macro defined in the header, so if a library function is declared explicitly when its header is included, one of the techniques shown below can be used to ensure the declaration is not affected by such a macro. Any macro definition of a function can be suppressed locally by enclosing the name of the function in parentheses, because the name is then not followed by the left parenthesis that indicates expansion of a macro function name. For the same syntactic reason, it is permitted to take the address of a library function even if it is also defined as a macro. The use of #undef to remove any macro definition will also ensure that an actual function is referred to.

If you need to do this, though, you probably should add comments to your code explaining it since it looks a little weird and isn't common practice. If feasible, renaming the function to avoid the name collision might be more maintainable in the long run.

Upvotes: 14

Dewfy
Dewfy

Reputation: 23644

Provide trick before call

#ifdef foo
#undef foo
#endif //

So locally in single file that invokes function you will always have explicit behaviour

Upvotes: 1

Anthon
Anthon

Reputation: 76882

Rename one of the two. Or if that is not possible make a function pointer to the original function before you define the macro and call the function via that pointer.

Upvotes: 1

Related Questions