メインコンテンツ

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

MISRA C++:2008 Rule 16-0-2

Macros shall only be #define 'd or #undef 'd in the global namespace.

説明

ルール定義

Macros shall only be #define 'd or #undef 'd in the global namespace. 1

根拠

ローカル名前空間でマクロを定義または定義解除するときには、マクロはローカル名前空間でのみ有効であると想定されます。ただしマクロはスコーピング メカニズムに従っていません。その代わりにコンパイラが、#define ステートメントからファイルの終わりまたはマクロの再定義までの間で、マクロのすべての出現箇所を、定義されている値に置き換えます。このマクロの動作は開発者の想定に反している可能性があり、バグを引き起こすロジック エラーの原因となる場合があります。

Polyspace 実装

Polyspace® は、グローバル名前空間ではなくブロック内に配置されている #define または #undef ステートメントにフラグを設定します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include<cstdlib>
#define HCUT 1
namespace unnormalized{
	#define HCUT 6582 //Noncompliant
	void foo(){
		//...
	}
};
void bar(){
	int intEnergy = HCUT*10; 
	//HCUT is 6582, you might expect HCUT=1;
}

namespace uniteV{
	const double hcut = 6582; //eV
	void foo(){
		
	}
};

この例では、おそらく異なる単位系を使用して記述されたコードに対応する目的で、HCUT に異なる値が定義されています。名前空間 unnormalized での HCUT の定義は、その名前空間に限定して維持されることが想定されます。ただし HCUT の値は、ファイルの終わりまで 6582 のままです。たとえば関数 bar で、HCUT が 1 であると想定したのに、HCUT の値が 6582 のままであると、ロジック エラー、予期しない結果、バグが発生する可能性があります。Polyspace は、ローカル名前空間内の #define ステートメントにフラグを設定します。

異なるスコープで異なる値を持つ可能性がある定数を実装するには、名前空間 uniteV に示すように変数 const を使用してください。異なるスコープで異なる値を必要とする可能性がある定数を表現するときには、マクロの使用を回避します。

チェック情報

グループ: Preprocessing Directives
カテゴリ: 必要

バージョン履歴

R2013b で導入


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.