メインコンテンツ

MISRA C:2012 Rule 20.7

Expressions resulting from the expansion of macro parameters shall be enclosed in parentheses

説明

ルール定義

Expressions resulting from the expansion of macro parameters shall be enclosed in parentheses 1 .

根拠

小かっこを使用しない場合、マクロ置換が発生するときに、演算子の優先順位では必要な結果が得られない場合があります。

マクロ パラメーターを式として使用していない場合、マクロに演算子は含まれていないため、小かっこは必要ありません。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

#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 は 2 つの定義されたマクロ式です。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 カテゴリ: 必要

バージョン履歴

すべて展開する


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace® Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.