MISRA C:2012 Rule 21.1

#define и #undef не должны использоваться на зарезервированном идентификаторе или зарезервировали макро-имя

Описание

Управляйте определением

#define и #undef не должны использоваться на зарезервированном идентификаторе или зарезервировали макро-имя.

Объяснение

Зарезервированные идентификаторы и зарезервированные макро-имена предназначаются для использования реализацией. Удаление или изменение значения зарезервированного макроса могут привести к неопределенному поведению. Это правило применяется к следующему:

  • Идентификаторы или макро-имена, начинающиеся с подчеркивания

  • Идентификаторы в осциллографе файла, описанном в Стандартной Библиотеке C (ISO®/IEC 9899:1999, Раздел 7, "Библиотеке")

  • Макро-имена, описанные в Стандартной Библиотеке C, как задаваемой в стандартном заголовке (ISO/IEC 9899:1999, Раздел 7, "Библиотеке").

Обменивайтесь сообщениями в отчете

  • Макро-macro_name не буду переопределен.

  • Макро-macro_name не будет не определено.

  • Макро-macro_name не буду задан.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

#undef __LINE__               /* Non-compliant - begins with _ */
#define _Guard_H 1            /* Non-compliant - begins with _ */
#undef _ BUILTIN_sqrt        /* Non-compliant - implementation may
                               * use _BUILTIN_sqrt for other purposes,
                               * e.g. generating a sqrt instruction */
#define defined               /* Non-compliant - reserved identifier */
#define errno my_errno        /* Non-compliant - library identifier */
#define isneg(x) ( (x) < 0 )  /* Compliant - rule doesn't include  
                               * future library directions   */

Проверяйте информацию

Группа: стандартные библиотеки
Категория: необходимый
Категория AGC: необходимый
Языки: C90, C99

Введенный в R2014b