MISRA C++:2008 Rule 16-1-1

Заданный оператор препроцессора должен только использоваться в одной из двух стандартных форм

Описание

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

Заданный оператор препроцессора должен только использоваться в одной из двух стандартных форм.

Объяснение

defined оператор препроцессора проверяет, задан ли идентификатор как макрос. В C только две допустимых формы для этого оператора:

  • defined (identifier)

  • defined identifier

Используя любые другие результаты формы в недопустимом коде, о котором не может сообщить компилятор. Например, если вы используете выражения в качестве аргументов для defined оператор, код недопустим. Если компилятор не сообщает о недопустимом использовании defined, диагностирование недопустимого кода затрудняет.

Если ваш #if или подобные директивы препроцессору расширяются, чтобы создать defined оператор, поведение кода не определено. Например:

#define DEFINED defined
#if DEFINED(X)
#if директива препроцессору расширяется, чтобы сформировать defined операция. В зависимости от вашей среды код может вести себя неожиданными способами, ведя к ошибкам, которые затрудняют, чтобы диагностировать.

Чтобы избежать недопустимого кода, ошибки и неопределенное поведение, используют только разрешенные формы при использовании defined оператор.

Реализация Polyspace

Polyspace® отмечает неправильные использования defined оператор, такой как:

  • Оператор defined используется без идентификатора.

  • Оператор defined появляется после макрорасширения.

  • Оператор defined используется со сложным выражением.

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

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

Примеры

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

#if defined (X<Y)//Noncompliant
//...
#endif
#if defined (X) && defined (Y) &&(X<Y)//Compliant
//...
#endif

В этом примере условно выполняется блок кода, только если X и Y идентификаторов заданы и если X меньше, чем Y. Построение этого условия при помощи выражения в качестве аргумента для defined оператор не допустим и приводит к недопустимому коду. Polyspace отмечает непозволительный defined оператор. Допустимый способ задать такое условие состоит в том, чтобы использовать отдельные идентификаторы с defined.

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

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