メインコンテンツ

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

C++ macros shall only be used for: include guards, type qualifiers, or storage class specifiers.

説明

ルール定義

C++ macros shall only be used for: include guards, type qualifiers, or storage class specifiers. 1

根拠

インクルード ガード、型修飾子、およびストレージ クラス指定子の定義の他に、定数や関数形式のマクロの定義などの目的で C++ マクロを使用することがあります。これらのマクロは一般的なリンクに従わず、またスコーピング メカニズムや型の安全性が欠落しています。C++ で利用可能な代替方法と比較すると、マクロは安全性が低くなります。たとえば #define ステートメントを使用して定義される定数は、ローカル スコープで定義されている場合であっても、すべてのスコープでその値を維持します。スコープごとに定数の定義が異なる場合、constexpr の代わりにマクロを使用すると、混乱が生じる可能性があります。変数 constexpr は明確に定義されたスコープを維持するため、より安全な代替手段です。constexpr はコンパイル時定数であるため、効率的です。

マクロをインクルード ガード、型修飾子、およびストレージ クラス指定子を定義するために使用するのでなければ、マクロを使用しないようにします。代わりにインライン関数、const オブジェクトまたは constexpr オブジェクト、関数テンプレートなどの機能を使用してください。

Polyspace 実装

チェッカーは、マクロがインクルード ガードや staticinlinevolatileautoregisterconst などの型修飾子またはストレージ クラス指定子以外のものを展開する #define ステートメントにフラグを設定します。

トラブルシューティング

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

すべて展開する

#ifndef IDENTIFIER //Compliant
#define IDENTIFIER //Compliant
#endif             //Compliant - Include guard

#define STOR extern      // Compliant - Storage class specifier
#define VOL volatile	 //Compliant - Type qualifier

#define CLOCK (xtal/16)              // Noncompliant
#define PLUS2(X) ((X) + 2)           // Noncompliant
#define PI 3.14159F                  // Noncompliant
#define int32_t long                 // Noncompliant
#define STARTIF if(                  // Noncompliant
#define INIT(value) {(value), 0, 0}  // Noncompliant
#define HEADER "filename.h"          // Noncompliant

この例では、インクルード ガード、ストレージ クラス指定子、および型修飾子を定義するマクロ以外のすべてのマクロに Polyspace がフラグを設定します。

チェック情報

グループ: 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.