メインコンテンツ

AUTOSAR C++14 Rule A16-0-1

The preprocessor shall only be used for unconditional and conditional file inclusion and include guards, and using specific directives

説明

ルール定義

プリプロセッサは、無条件および条件付きのファイルのインクルードおよびインクルード ガード、ならびに特定の命令のためだけに使用されるものとする。

根拠

無条件および条件付きのファイルのインクルードおよびインクルード ガード以外には、プリプロセッサ命令を使用しないようにします。代わりに、より安全な別の命令を使用します。次に例を示します。

  • 以下のようにはしません。

    #define MIN(a,b) ((a < b)? (a) : (b))
    代わりに、インライン関数および関数テンプレートを使用できます。

  • 以下のようにはしません。

    #define MAX_ARRAY_SIZE 1024U
    定数オブジェクトを使用できます。

このような状況において、プリプロセッサ命令では、別の命令で得られる利点 (リンク、データ型のチェック、オーバーロードなど) を活用できません。

Polyspace 実装

ルール チェッカーは、プリプロセッサ命令の使用を許可しません。例外は次の場合のみです。

  • #ifdef#ifndef#if#if defined#elif#else#endif。条件付きのファイルのインクルードおよびインクルード ガードに使用される場合のみ。

  • #define。インクルード ガードで使用されるマクロの定義に使用される場合のみ。たとえば、この例では、マクロ __FILE_H__ が、ヘッダー ファイルの内容を複数回インクルードすることを防ぎます。

    /* aHeader.h */
    
    #ifndef __FILE_H__
    #define __FILE_H__
       /* Contents of header file */   
    #endif
    

    #ifdef#define#endif がヘッダー ファイル内でインクルード ガードとして使用される場合、そのヘッダー ファイルの全内容がインクルード ガード内に含まれなければなりません。

  • #include

チェッカーは、他のコンテキストにおける #define 命令を許可しません。複数の #define をインクルード ガード以外の目的で使用する場合、次のいずれかを行います。

トラブルシューティング

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

すべて展開する

#include <cstdint>       //Compliant: unconditional file inclusion

#ifdef WIN32             //Compliant: include guard
   #include <windows.h>  //Compliant: conditional file inclusion
#endif                   

#ifdef WIN32     //Noncompliant
    std::int32_t func(std::int16_t x, std::int16_t y) noexcept; 
#endif

この例では、プリプロセッサ命令が無条件および条件付きのインクルードおよびインクルード ガードに使用される場合、ルールに違反しません。それ以外の場合はルール違反となります。

チェック情報

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

バージョン履歴

R2019b で導入