简体   繁体   中英

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

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?

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM