Do I check the existence of a macro function with or without the parens?

468 Views Asked by At

Before I define a macro function, I can check that it doesn't already exist
(this avoids overwriting a previous definition).

I can implement the check and definition like this:

#ifndef MACRO(X)
#define MACRO(X) FUNCTION(X)
#endif

Or like this:

#ifndef MACRO
#define MACRO(X) FUNCTION(X)
#endif

Both appear to work when the function is already defined.
So, which is correct? Which is preferred?

2

There are 2 best solutions below

0
On BEST ANSWER

Without.

The standard specifies that #ifndef is equivalent to #if !defined, and that the argument to defined must be a (possibly parenthesized) identifier. You can't have parens in an identifier, so defined MACRO(X) is not an allowed form. This use of defined causes undefined behaviour, so it is not portable.

0
On

Without parentheses. Because of this reason:

test.c

#ifdef MACRO(x)
#endif
int main() {}

If you try to compile this:

$ gcc test.c
test.c:2:13: warning: extra tokens at end of #ifdef directive [enabled by default]
 #ifdef MACRO(x)
             ^

It gives a warning.