MISRA C++:2008 Rule 16-0-7

Неопределенные макро-идентификаторы не должны использоваться в #if или #elif директивах препроцессору, за исключением операндов к заданному оператору

Описание

Управляйте определением

Неопределенные макро-идентификаторы не должны использоваться в #if или #elif директивах препроцессору, за исключением операндов к заданному оператору.

Объяснение

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

Реализация Polyspace

Polyspace® отмечает #if или #elif оператор, если это использует неопределенный макро-идентификатор.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

#if M == 0           //Noncompliant
#endif

#if defined (M)      //Complaint
#if M == 0           //Executes only when M is defined
#endif
#endif

#if defined (M) && (M == 0)  //Compliant
//...
#endif

Этот пример показывает различное использование M в предварительной обработке директив:

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

  • Второе и треть #if операторы используют неопределенный идентификатор M как операнд к defined оператор. Они использование неопределенных идентификаторов совместимы с этим правилом.

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

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