メインコンテンツ

MISRA C++:2008 Rule 7-3-1

The global namespace shall only contain main, namespace declarations and extern "C" declarations.

説明

ルール定義

The global namespace shall only contain main, namespace declarations and extern "C" declarations. 1

根拠

このルールは、グローバル スコープで見つかったすべての名前が 1 つの名前空間に属していることを確認します。このルールに従うことによって、名前の衝突が回避され、開発者が変数名を再利用することでコンパイル/リンク エラーが発生したり、変数名をシャドウすることで後で予期せぬ問題が発生したりすることを防ぐことができます。

Polyspace 実装

main 関数を除いて、チェッカーは、グローバル スコープで使用されている名前空間に属していないすべての名前にフラグを設定します。

名前が extern "C" ブロック (C++ コード内に含まれている C コード) で宣言されている場合、グローバル スコープでその名前にはフラグが設定されることはありません。ただし、オプション [リンク エラーを無視] (-no-extern-c) が使用されている場合は、これらの名前にもフラグが設定されます。

トラブルシューティング

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

すべて展開する

この例では、このルールに違反する、グローバル名前空間内の名前を示しています。

#include <cstdint>
void foo(int32_t);                //Noncompliant
int32_t var1;                      //Noncompliant

namespace                       // Compliant
{
	void foo2(int32_t);             // Rule does not apply
	int32_t var2;                 // Rule does not apply
}

namespace ns_foo                // Compliant
{
	void bar(int32_t);             // Rule does not apply
	int32_t var3;                   // Rule does not apply
}

namespace ns_x = ns_foo;          // Compliant

int main()                      // Compliant
{
	extern void foo3();             //Noncompliant
}

この例では、Polyspace が以下に対してこのルールの違反を報告します。

  • グローバル名前空間内の変数 (var1 など) の宣言。

  • グローバル名前空間内の extern でない関数 (foo など) の宣言。

  • 非グローバル名前空間内の extern 関数の宣言

このルールは、ローカル名前空間内の extern ではない名前には適用されません。

チェック情報

グループ: Declarations
カテゴリ: 必要

バージョン履歴

R2013b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.