(cpp.info.gz) Directives Within Macro Arguments

Info Catalog (cpp.info.gz) Undefining and Redefining Macros (cpp.info.gz) Macros (cpp.info.gz) Macro Pitfalls
 
 3.9 Directives Within Macro Arguments
 =====================================
 
 Occasionally it is convenient to use preprocessor directives within the
 arguments of a macro.  The C and C++ standards declare that behavior in
 these cases is undefined.
 
    Versions of CPP prior to 3.2 would reject such constructs with an
 error message.  This was the only syntactic difference between normal
 functions and function-like macros, so it seemed attractive to remove
 this limitation, and people would often be surprised that they could
 not use macros in this way.  Moreover, sometimes people would use
 conditional compilation in the argument list to a normal library
 function like `printf', only to find that after a library upgrade
 `printf' had changed to be a function-like macro, and their code would
 no longer compile.  So from version 3.2 we changed CPP to successfully
 process arbitrary directives within macro arguments in exactly the same
 way as it would have processed the directive were the function-like
 macro invocation not present.
 
    If, within a macro invocation, that macro is redefined, then the new
 definition takes effect in time for argument pre-expansion, but the
 original definition is still used for argument replacement.  Here is a
 pathological example:
 
      #define f(x) x x
      f (1
      #undef f
      #define f 2
      f)
 
 which expands to
 
      1 2 1 2
 
 with the semantics described above.
 
Info Catalog (cpp.info.gz) Undefining and Redefining Macros (cpp.info.gz) Macros (cpp.info.gz) Macro Pitfalls
automatically generated by info2html