私の開発システム(Codegear C++ Builder)の気まぐれの1つは、自動生成されたヘッダーの一部が...
using namespace xyzzy
...それらの文。これは、私がそれを望んでいない、または期待しているときにコードに影響を与えます。
これを回避するために、以前の「使用中」ステートメントを何らかの方法でキャンセル/オーバーライドできる方法はありますか。
多分...
unusing namespace xyzzy;
いや。しかし、潜在的な解決策があります。次のように、独自の名前空間でincludeディレクティブを囲むと...
namespace codegear {
#include "codegear_header.h"
} // namespace codegear
...そのヘッダー内のusingディレクティブの効果は無効化されます。
それは場合によっては問題になるかもしれません。これが、すべてのC++スタイルガイドがnotを使用して、ヘッダーファイルに「名前空間を使用する」ディレクティブを配置することを強く推奨する理由です。
いいえ、できませんnuse名前空間。できることは、using namespace
-ブロックを記述して、そのスコープを制限します。
例:
{
using namespace xyzzy;
} // stop using namespace xyzzy here
おそらく、自動生成されたヘッダーで使用されるテンプレートを変更できます。
競合の明示的な名前空間を使用して立ち往生する場合があります。
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
将来の参考のために:XEバージョン以降は、インクルードの恐ろしいusing namespace System;
を避けるために#defineできる新しい値があります:DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE
Sed、Perl、またはその他のコマンドラインツールをビルドプロセスの一部として使用して、生成されたヘッダーを生成後、使用前に変更するのはどうですか?
Visual Studio 2005の簡単な実験では、これらのヘッダーを独自の名前付きネームスペースで囲み、このネームスペースから必要なものをuse
で囲むことができることが示されています(ただし、use
非表示にするネームスペースを紹介します。