メインコンテンツ

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

Multiple declarations for an identifier in the same namespace shall not straddle a using-declaration for that identifier.

説明

ルール定義

Multiple declarations for an identifier in the same namespace shall not straddle a using-declaration for that identifier. 1

根拠

このルールでは、using 宣言で識別子が既に導入された "後" に、同じ名前の識別子を名前空間で宣言してはなりません。using ステートメントの後の宣言は、開発者を混乱させる可能性があります。

たとえば、次のような using 宣言は、

using NS::func;
現在のスコープ内の名前空間 NS から名前 func を導入します。NS 内に func の 2 つのオーバーロード (using ステートメントの前で宣言されたものと後で宣言されたもの) が存在する場合は、前に宣言されたオーバーロードだけが名前ルックアップに公開され、func の呼び出し時に呼び出されます。ただし、開発者が func に対する呼び出しにおいて、後で宣言されたオーバーロードが呼び出されることを想定していることがあります (関数引数に基づき、後で宣言されたオーバーロードのほうが適切である場合など)。

Polyspace 実装

ルール チェッカーは、識別子が名前空間内で次の 2 つのイベントの後で宣言された場合に違反を報告します。

  1. 同じ名前の別の識別子が同じ名前空間内で既に宣言されている。

  2. using 宣言でその名前が既に名前ルックアップに公開されている。

トラブルシューティング

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

すべて展開する

#include <cstdint>

namespace initialTests {
    void validateInput(uint16_t input);
}

using initialTests::validateInput;

namespace initialTests {
    void validateInput(uint32_t input); //Noncompliant
}

namespace periodicTests {
    void validateResults(uint16_t results);
    void validateResults(uint32_t results); //Compliant
}

using periodicTests::validateResults; 

void main() {
    validateInput(0U);
    validateResults(0U);
}

この例では以下のようになります。

  • 名前空間 initialTests 内の validateInput(uint32_t) の宣言は、この名前空間からの名前 validateInput が既に using 宣言で公開されているため、ルール違反になります。この validateInput() の 2 つ目の宣言は、開発者を混乱させる可能性があります。たとえば、main 内の validateInput() に対する呼び出しによって validateInput(uint16_t) が呼び出されますが、開発者は、この呼び出しにより適切な validateInput(uint32_t) が呼び出されることを想定している場合があります。

  • 名前空間 periodicTests 内の validateResults() の宣言は、両方の宣言が using ステートメントの前に出現するため、ルール違反になりません。関数 validateResults() が呼び出されると、validateResults() のすべてのオーバーロードが名前ルックアップに公開されます。開発者は、オーバーロード宣言内で validateResults() のパラメーターのみを使用して呼び出されるオーバーロードを判別できるため、混乱する可能性は低くなります。

チェック情報

グループ: 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.