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: необходимый