メインコンテンツ

AUTOSAR C++14 Rule M16-0-7

Undefined macro identifiers shall not be used in #if or #elif pre-processor directives, except as operands to the defined operator

説明

ルール定義

未定義のマクロ識別子は、定義済みの演算子のオペランドを除き #if または #elif プリプロセッサ命令で使用してはなりません。

根拠

プリプロセッサ命令でマクロ識別子を使用しようとすると、その識別子を定義していない場合、プリプロセッサはその値をゼロと仮定します。この値は開発者の予想と異なる可能性があります。

Polyspace 実装

Polyspace® は、#if または #elif ステートメントで未定義のマクロ識別子を使用している場合に、これらのステートメントにフラグを設定します。

トラブルシューティング

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

すべて展開する

#if M == 0           //Noncompliant
#endif

#if defined (M)      //Complaint
#if M == 0           //Executes only when M is defined
#endif
#endif

#if defined (M) && (M == 0)  //Compliant
//...
#endif

#define XXYY 1                                          
#define ADD(a,b) a##b                                   

#if ADD(XX,YY)  // Compliant                                        
#endif

この例ではプリプロセッサ命令での M のさまざまな使用方法を示しています。

  • 1 番目の #if 句では、未定義の識別子 M が使用されています。プリプロセッサ命令の評価時に M が未定義であるため、コンパイラは M がゼロであると想定し、その結果予期せぬ結果が生じます。未定義の識別子のこのような使用は、このルールに準拠していません。Polyspace はステートメント #if にフラグを設定します。

  • 2 番目と 3 番目の #if ステートメントでは、未定義の識別子 Mdefined 演算子のオペランドとして使用されています。未定義の識別子のこのような使用は、このルールに準拠しています。

  • 最後の #if ステートメントはマクロ ADD() の結果を使用します。このマクロは定義済みのトークン XXYY に解決されます。Polyspace は違反を報告しません。

チェック情報

グループ: プリプロセッサ命令
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入