名前空間を「使用しない」にはどうすればよいですか?


86

私の開発システム(Codegear C ++ Builder)の気まぐれの1つは、自動生成されたヘッダーのいくつかが...

using namespace xyzzy

...それらのステートメント。これは、私が最も望んでいない、または期待していないときにコードに影響を与えます。

これを回避するために、以前の「using」ステートメントをなんとかしてキャンセル/オーバーライドできる方法はありますか?

多分...

unusing namespace xyzzy;

3
おそらく、QCシステムでバグレポートを開く必要があります:qc.codegear.com
Kris Kumler 2008年

2
ところで、自動生成されたヘッダーはどれですか?
Kris Kumler 2008年

2
いつの日か、C ++にはモジュールがあり、コードを他のコードに含めると、より優れたカプセル化構造が得られます。それまでは、これを回避する簡単な方法はありません。独自のコードを名前空間に入れて、そのように参照することを検討してください。
トレバーヒッキー2015年

回答:


59

いいえ。しかし、潜在的な解決策があります。次のように、includeディレクティブを独自の名前空間で囲む場合...

namespace codegear {
    #include "codegear_header.h"
} // namespace codegear

...次に、そのヘッダー内のusingディレクティブの影響は無効になります。

それは場合によっては問題になるかもしれません。そのため、すべてのC ++スタイルガイドでは、ヘッダーファイルに「usingnamespace」ディレクティブを配置しないことを強く推奨してます。


1
一般的に、これはひどい考えです。C ++ヘッダーは、ここで使用されているような代替名前空間に含まれることを意図していません。
アーロン

24
ヘッダーファイルにもusingディレクティブを含めるのはひどい考えです。これは単にその問題を軽減します。
ヘッドオタク

4
ヘッダーを独自の名前空間に配置すると、そのライブラリ内の宣言の意味が変わるため、解決策にはなりません。(-1)
リチャードコーデン

4
それは、ヘッダーで宣言されている内容に完全に依存します。
ヘッドオタク

1
それが未定義の振る舞いである理由です。
Kris Kumler 2008年

56

いいえはできませんUNUSE名前空間を。実行できる唯一のことは、using namespace-statementをブロックしてそのスコープを制限することです。

例:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

自動生成されたヘッダーで使用されるテンプレートを変更できるかもしれません。


ただし、このようなブロックでインクルードをラップできますか?
Eclipse

はい、これは自動生成されたコードでは起こりません。ちなみに、彼は自動生成されたコードのテンプレートを変更できますか?
JK。

ええ、これは彼が名前空間を使用するヘッダーに関して抱えている問題に実際には対処していません。
キップ

残念ながら、これは真実ではありません。これを試して:
Adam

名前空間xyzzy {const int i {名前空間xyzzyを使用; } //ここで名前空間xyzzyの使用を停止します
Adam

17

競合時に明示的な名前空間を使用してスタックする可能性があります。

string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace

10

今後の参考のために:XEバージョン以降、恐ろしいusing namespace System;intを回避するために#defineできる新しい値があります:DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE


しかし、これは正しく機能していないようです。少なくともすべての場合に私は試しました(BCB6で)。その後、競合時に明示的な名前空間を追加することにフォールバックし、さらに悪いことに、型名の競合を回避するためのヘッダーを含めました...
Wolf

6

ビルドプロセスの一部としてsed、perl、またはその他のコマンドラインツールを使用して、生成されたヘッダーを生成された後、使用される前に変更するのはどうですか?


1

Visual Studio 2005を使った簡単な実験では、これらのヘッダーを独自の名前空間で囲み、次にuseこの名前空間から必要なものを囲むことができることが示されています(ただしuse、非表示にする名前空間が導入されるため、名前空間全体ではありません。


1
ヘッダーファイルがライブラリの宣言である場合、これにより名前マングリングの問題が発生する可能性があります。コンパイルは成功しますが、別の名前空間で既にコンパイルされているため、リンカは定義を見つけることができません。
Eclipse

-1
#include<iostream>
#include<stdio.h>
namespace namespace1 {
    int t = 10;
}
namespace namespace2 {
    int t = 20;
}
int main() {
using namespace namespace1;
    printf("%d" , t);
    printf("%d" , namespace2::t);
}

1
あなたの答えを説明してください!
Mazz 2017

スコープ解決演算子を使用して、別の名前空間変数を使用できます
Narendra kumawat 2017

3
質問に対処していません
MM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.