web-dev-qa-db-ja.com

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

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

using namespace xyzzy

...それらの文。これは、私がそれを望んでいない、または期待しているときにコードに影響を与えます。

これを回避するために、以前の「使用中」ステートメントを何らかの方法でキャンセル/オーバーライドできる方法はありますか。

多分...

unusing namespace xyzzy;
76
Roddy

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

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

...そのヘッダー内のusingディレクティブの効果は無効化されます。

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

56
Head Geek

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

例:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

おそらく、自動生成されたヘッダーで使用されるテンプレートを変更できます。

46
jk.

競合の明示的な名前空間を使用して立ち往生する場合があります。

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
15
Eclipse

将来の参考のために:XEバージョン以降は、インクルードの恐ろしいusing namespace System;を避けるために#defineできる新しい値があります:DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE

10
cdelacroix

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

7
Arkadiy

Visual Studio 2005の簡単な実験では、これらのヘッダーを独自の名前付きネームスペースで囲み、このネームスペースから必要なものをuseで囲むことができることが示されています(ただし、use非表示にするネームスペースを紹介します。

1
Kasprzol