MISRA C:2012 Rule 20.9

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

Описание

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

Все идентификаторы, используемые в управляющем выражении директивы предварительной обработки # if или # elif, должны быть # defined 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 не определен, оператор не совместим.

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

Группа: Директивы предварительной обработки
Категория: Требуемая
Категория AGC: Требуется