MISRA C:2012 Rule 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 не задан, оператор несовместим.

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

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