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

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

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

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