AUTOSAR C++14 Rule M16-2-3
Include guards shall be provided.
説明
ルール定義
Include guards shall be provided.
根拠
入れ子にされたヘッダー ファイルの複雑な階層が翻訳単位に含まれる場合、特定のヘッダー ファイルが 2 回以上インクルードされ、混乱の原因になる可能性があります。複数回のインクルードにより複数の定義または定義の競合が生じる場合、プログラムで未定義の動作または誤動作が発生する可能性があります。
たとえば、ヘッダー ファイルに以下が含まれるとします。
#ifdef _WIN64 int env_var; #elseif long int env_var; #endif
_WIN64 を定義するパスと定義解除するパス) に含まれる場合、env_var の定義の競合が発生する可能性があります。同一ファイルが複数回インクルードされることを避けるには、ヘッダー ファイルの先頭にインクルード ガードを追加します。次のいずれかの形式を使用します。
<start-of-file> // Comments allowed here #if !defined ( identifier ) #define identifier // Contents of file #endif <end-of-file>
<start-of-file> // Comments allowed here #ifndef identifier #define identifier // Contents of file #endif <end-of-file>
Polyspace 実装
チェッカーは、ヘッダー ファイルにインクルード ガードが含まれていない場合に違反を報告します。
たとえば、次のコードは #define および #include ステートメントのインクルード ガードを使用しています。このコードはルール違反ではありません。
// Contents of a header file #ifndef FILE_H #define FILE_H #include "libFile.h" #endif
#ifndefおよび#defineステートメントで、誤って異なる識別子を使用する可能性があります。#ifndef MACRO #define MICRO //... #endif
意図せずに、
#ifndefの代わりに#ifdefを使用したり、#defineステートメントを省略したりする可能性があります。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: プリプロセッサ命令 |
| カテゴリ: Required、Automated |
バージョン履歴
R2019a で導入