You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

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

References

[Non-bugs in GCC C]

  • No labels