The arguments to a macro should not include preprocessor directives such as #define, #ifdef, and #include. Doing so is undefined behavior. This includes using preprocessor directives in arguments to a function where it is unknown whether or not the function is implemented using a macro. Examples include standard library functions such as memcpy()
, printf()
, and assert()
.
Noncompliant Code Example
In this noncompliant code example [Non-bugs in GCC C], the author is attempting to specify an argument to memcpy()
depending on the current platform by using preprocessor directives within the function call. However, if memcpy()
is implemented using a macro, the code will result in undefined behavior.
memcpy(dest, src, #ifdef PLATFORM1 12 #else 24 #endif );
Compliant Code Example
In this compliant solution [Non-bugs in GCC C], the appropriate call to memcpy()
is determined outside the function call.
#ifdef PLATFORM1 memcpy(dest, src, 12); #else memcpy(dest, src, 24); #endif