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 をインクルード ガード以外の目的で使用する場合、次のいずれかを行います。
コードのコンパイル時にマクロを定義する場合、複数の
#defineを使用する代わりにコンパイル フラグ (GCC オプション-Dなど) を使用します。Polyspace® 解析の実行中は、等価の Polyspace オプションプリプロセッサ定義 (-D)を使用します。コード内で
#defineを継続使用する場合、結果またはコード内でコメントを使用して違反を正当化します。Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処を参照してください。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: プリプロセッサ命令 |
| カテゴリ: Required、Automated |
バージョン履歴
R2019b で導入