MISRA C:2012 Rule 21.1

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

Описание

Определение правила

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

Объяснение

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

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

  • Идентификаторы в области файлов, описанные в стандартной библиотеке C

  • Имена макросов, описанные в стандартной библиотеке C, определяются в стандартном заголовке

Средство проверки правил может пометить различные идентификаторы или макросы в зависимости от версии стандарта C, используемой в анализе. См. C standard version (-c-version). Например, если вы запускаете анализ C99, зарезервированные идентификаторы и макросы определяются в 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: Требуется
Введенный в R2014b