私の開発システム (Codegear C++Builder) の気まぐれの 1 つは、自動生成されたヘッダーの一部が、.
using namespace xyzzy
...それらのステートメントは、私が最も望んでいない、または期待していないときにコードに影響を与えます。
これを回避するために、以前の「using」ステートメントをキャンセル/オーバーライドする方法はありますか。
多分...
unusing namespace xyzzy;
私の開発システム (Codegear C++Builder) の気まぐれの 1 つは、自動生成されたヘッダーの一部が、.
using namespace xyzzy
...それらのステートメントは、私が最も望んでいない、または期待していないときにコードに影響を与えます。
これを回避するために、以前の「using」ステートメントをキャンセル/オーバーライドする方法はありますか。
多分...
unusing namespace xyzzy;
いいえ。しかし、解決策の可能性があります。次のように、include ディレクティブを独自の名前空間で囲むと...
namespace codegear {
#include "codegear_header.h"
} // namespace codegear
...その後、そのヘッダー内の using ディレクティブの効果は中和されます。
それは場合によっては問題になるかもしれません。そのため、すべての C++ スタイル ガイドでは、"using namespace" ディレクティブをヘッダー ファイルに配置しないことを強く推奨しています。
いいえ、名前空間の使用を取り消すことはできません。あなたができる唯一のことは、using namespace
-statement をブロックに入れてその範囲を制限することです。
例:
{
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 バージョン以降、恐ろしい int を避けるために #define できる新しい値がありusing namespace System;
ます: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE
ビルド プロセスの一部として sed、perl、またはその他のコマンド ライン ツールを使用して、生成された後、使用される前に、生成されたヘッダーを変更するのはどうですか?
use
Visual Studio 2005 での簡単な実験では、これらのヘッダーを独自の名前付き名前空間で囲んでから、この名前空間から必要なものを囲むことができることを示しています (ただしuse
、隠したい名前空間が導入されるため、名前空間全体ではありません。