exponenta event banner

MISRA C:2012 Правило 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). Этот макрос и выражение макроса совместимы.

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

Группа: Директивы предварительной обработки
Категория: Обязательно
Категория СМЖЛ: требуется