メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C:2023 Dir 4.9

A function should be used in preference to a function-like macro where they are interchangeable

R2024a 以降

説明

命令の定義

A function should be used in preference to a function-like macro where they are interchangeable

根拠

可能な場合には、マクロの代わりに関数を使用します。関数は引数タイプのチェックと引数の評価を 1 回行い、複数の潜在的な二次的影響を含む問題を回避します。

Polyspace 実装

Polyspace® は、すべての関数形式のマクロ定義に対してこのルールの違反を報告します。

例外として、_Generic 選択に対して関数形式のマクロを使用する場合、Polyspace はこのルールに対する違反を報告しません。

トラブルシューティング

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

すべて展開する

この例では、関数形式のマクロ MAX は引数を複数回評価します。このマクロを呼び出した後で、x の値は 6、y の値は 12 になります。これは予期されていないため、Polyspace はこの関数形式のマクロに対して違反を報告します。

#include <stdio.h>

#define MAX(a, b) ((a) > (b) ? (a) : (b))  //Noncompliant

int main() {
	int x = 5;
	int y = 10;
	int max = MAX(x++, y++);

	printf("max: %d\n", max);
	printf("x: %d\n", x);
	printf("y: %d\n", y);
	return 0;
}

チェック情報

グループ: Code design
カテゴリ: 推奨
AGC カテゴリ: 推奨

バージョン履歴

R2024a で導入