メインコンテンツ

AUTOSAR C++14 Rule A16-2-3

An include directive shall be added explicitly for every symbol used in a file

R2021b 以降

説明

ルール定義

An include directive shall be added explicitly for every symbol used in a file.

根拠

コンパイル エラーを回避するには、すべてのシンボル、マクロ、データ型を使用前に宣言し、これらに関連付けられているヘッダー ファイルをソース ファイルにインクルードします。

Polyspace 実装

ソース ファイルにシンボル、マクロ、またはデータ型が含まれていて、それらのシンボル、マクロ、またはデータ型が定義されているヘッダー ファイルが同じソース ファイルにインクルードされない場合、Polyspace® は違反を報告します。

必要な include 命令を含むヘッダー ファイルがソース ファイルと名前を共有している場合には、Polyspace は違反を報告しません。

トラブルシューティング

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

すべて展開する

この例では、関数 printMembers の宣言で initializer_list が使用されていること、および for ループで int32_t が使用されていることから、Polyspace はこのコーディング ルールに対する違反を報告します。いずれの場合も、ソース コードがクラス テンプレート (initializer_list) と型 (int32_t) を定義するヘッダー ファイルを明示的にインクルードしていません。

注意する点として、initializer_list の場合、ヘッダー <string> にはヘッダー <intializer_list> が暗黙的に含まれますが、それでも Polyspace は違反を報告します。これは、ヘッダー <intializer_list> はソース コードに明示的に含まれていないためです。

#include <iostream>
#include <ostream>
#include <string>

void printMembers(std::initializer_list<int32_t> myList) //Noncompliant
{
        std::cout << "Printing list members...\n";
        for (int32_t member : myList)                    //Noncompliant
        {
                std::cout << member << "\n";
        }
}

int main()
{
        std::string msg = "Hello world : ";
        int32_t num = 5;
        std::cout << msg << num << "\n";

        std::initializer_list<int32_t> numList = {1, 2, 3, 4, 5};
        printMembers(numList);
        return 0;
}

チェック情報

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

バージョン履歴

R2021b で導入