exponenta event banner

MISRA C:2012 Правило 21.1

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

Описание

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

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

Объяснение

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

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

  • Идентификаторы в области файла, описанные в стандартной библиотеке 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   */

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

Группа: Стандартные библиотеки
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b