MISRA C:2012 Rule 20.7

Выражения, следующие из расширения макро- параметры, заключаются в круглые скобки

Описание

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

Выражения, вытекающие из расширения макро- параметры, заключаются в круглые скобки.

Объяснение

Если вы не используете круглые скобки, то возможно, что приоритет оператора не дает результатов, которые вы хотите, когда происходит подстановка макроса.

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

Дополнительное сообщение в отчете

Расширенный параметр макроса param заключаются в круглые скобки.

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

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

#define mac1(x, y) (x * y)
#define mac2(x, y) ((x) * (y))

void foo(void){
    int r;

    r = mac1(1 + 2, 3 + 4);       /* Non-compliant */
    r = mac1((1 + 2), (3 + 4));   /* Compliant */

    r = mac2(1 + 2, 3 + 4);       /* Compliant */
}

В этом примере mac1 и mac2 являются двумя заданными выражениями макроса. Определение mac1 не заключает аргументы в круглые скобки. В линии 7 макрос расширяется до r = (1 + 2 * 3 + 4); Это выражение может быть (1 + (2 * 3) + 4) или (1 + 2) * (3 + 4). Однако без круглых скобок программа не знает предполагаемого выражения. Линия 8 использует круглые скобки, поэтому линия расширяется до (1 + 2) * (3 + 4). Это выражение макроса соответствует.

Определение mac2 заключает аргумент в круглые скобки. Линия 10 (те же аргументы макроса в линии 7) расширяется до (1 + 2) * (3 + 4). Это выражение макроса и макроса совместимо.

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

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