When do we need #ifdef before #undef?

iammilind picture iammilind · Feb 1, 2012 · Viewed 10.4k times · Source

In many of the C and C++ files I have seen macros like this:

#ifdef X
#undef X  // no statements in between
#endif

I feel that, it's adequate to simply write:

#undef X

If the macro X wasn't defined, then the #undef should have no effect.

Is it ok to put standalone #undef, if I want to only undefine a macro ? Does that make the coding practice bad in anyway ?

Answer

Ken Bloom picture Ken Bloom · Feb 1, 2012

See ISO C99 6.10.3.5 paragraph 2.

A preprocessing directive of the form

# undef identifier new-line

causes the specified identifier no longer to be defined as a macro name. It is ignored if the specified identifier is not currently defined as a macro name.

Even Visual C++ 6 (which was notorious for bad standards compliance) allows this:

You can also apply the #undef directive to an identifier that has no previous definition. This ensures that the identifier is undefined. Macro replacement is not performed within #undef statements.