exponenta event banner

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

Все идентификаторы, используемые в управляющем выражении директив предварительной обработки # if или # elif, должны быть # define 'd перед оценкой

Описание

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

Все идентификаторы, используемые в управляющем выражении директив предварительной обработки # if или # elif, должны быть # define 'd перед оценкой.

Объяснение

Если попытка использовать идентификатор макроса в директиве предварительной обработки не определена, то препроцессор предполагает, что он имеет нулевое значение. Это значение может не соответствовать ожиданиям разработчиков.

Дополнительное сообщение в отчете

Identifier не определен.

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

#if M == 0                   /* Non-compliant - Not defined */
#endif

#if defined (M)              /* Compliant - M is not evaluate */
#if M == 0                   /* Compliant - M is known to be defined */
#endif
#endif

#if defined (M) && (M == 0)  /* Compliant
                              * if M defined, M evaluated in ( M == 0 ) */
#endif

В этом примере показаны различные виды использования M в директивах предварительной обработки. Второй и третий #if пункты проверить, определяет ли программное обеспечение M перед оценкой M. Первое #if предложение не проверяет, M определен, и потому что M не определен, оператор несовместим.

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

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