Rule A17-0-1 (required, implementation, automated)

Reserved identifiers, macros and functions in the C++ standard library shall not be defined, redefined or undefined.

Rationale

It is generally bad practice to #undef a macro that is defined in the standard library. It is also bad practice to #define a macro name that is a C++ reserved identifier, or C++ keyword or the name of any macro, object or function in the standard library. For example, there are some specific reserved words and function names that are known to give rise to undefined behavior if they are redefined or undefined, including defined, LINE, FILE, DATE, TIME, STDC, errno and assert. Refer to C++ Language Standard for a list of the identifiers that are reserved. Generally, all identifiers that begin with the underscore character are reserved.

Note that this rule applies regardless of which header files, if any, are actually included.

Example

// $Id: A17-0-1.cpp 271389 2017-03-21 14:41:05Z piotr.tanski $
2 #undef __TIME__
// Non-compliant
#define __LINE__ 20 // Non-compliant

See also

MISRA C++ 2008 [7]: Rule 17-0-1 Reserved identifiers, macros and functions in the standard library shall not be defined, redefined or undefined.