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.